mirror of
				https://github.com/espressif/esp-idf.git
				synced 2025-11-04 09:01:40 +01:00 
			
		
		
		
	This is required for std::condition_variable support Signed-off-by: Amey Inamdar <amey.inamdar@gmail.com>
		
			
				
	
	
		
			49 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			49 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#include <iostream>
 | 
						|
#include <thread>
 | 
						|
#include <condition_variable>
 | 
						|
#include <chrono>
 | 
						|
#include <mutex>
 | 
						|
#include <atomic>
 | 
						|
#include "unity.h"
 | 
						|
 | 
						|
#if __GTHREADS && __GTHREADS_CXX0X
 | 
						|
 | 
						|
std::condition_variable cv;
 | 
						|
std::mutex cv_m;
 | 
						|
std::atomic<int> i{0};
 | 
						|
 | 
						|
static void waits(int idx, int timeout_ms)
 | 
						|
{
 | 
						|
    std::unique_lock<std::mutex> lk(cv_m);
 | 
						|
    auto now = std::chrono::system_clock::now();
 | 
						|
 | 
						|
    if(cv.wait_until(lk, now + std::chrono::milliseconds(timeout_ms), [](){return i == 1;}))
 | 
						|
        std::cout << "Thread " << idx << " finished waiting. i == " << i << '\n';
 | 
						|
    else
 | 
						|
        std::cout << "Thread " << idx << " timed out. i == " << i << '\n';
 | 
						|
}
 | 
						|
 | 
						|
static void signals(int signal_ms)
 | 
						|
{
 | 
						|
    std::this_thread::sleep_for(std::chrono::milliseconds(signal_ms));
 | 
						|
    std::cout << "Notifying...\n";
 | 
						|
    cv.notify_all();
 | 
						|
    std::this_thread::sleep_for(std::chrono::milliseconds(signal_ms));
 | 
						|
    i = 1;
 | 
						|
    std::cout << "Notifying again...\n";
 | 
						|
    cv.notify_all();
 | 
						|
}
 | 
						|
 | 
						|
TEST_CASE("C++ condition_variable", "[std::condition_variable]")
 | 
						|
{
 | 
						|
    i = 0;
 | 
						|
    std::thread t1(waits, 1, 100), t2(waits, 2, 800), t3(signals, 200);
 | 
						|
 | 
						|
    t1.join();
 | 
						|
    t2.join();
 | 
						|
    t3.join();
 | 
						|
 | 
						|
    std::cout << "All threads joined\n";
 | 
						|
}
 | 
						|
#endif
 |