Threads share one address space (that is, they can all examine and modify the same variables). On the other hand, each thread has its own registers and execution stack pointer(執行堆疊), and perhaps private memory.
#include <iostream>
#include <condition_variable> // condition variable 條件變量
#include <thread>
#include <chrono>
std::condition_variable cv;
std::mutex cv_m; // This mutex is used for three purposes:
// 1) to synchronize accesses to i
// 2) to synchronize accesses to std::cerr
// 3) for the condition variable cv
int i = 0;
void waits() //used by t1,t2 & t3
{
std::unique_lock<std::mutex> lk(cv_m);
std::cerr << "Waiting... \n";
cv.wait(lk, []{return i == 1;}); //wait(lock)
std::cerr << "...finished waiting. i == 1\n";
}
void signals()// used by thread t4
{
std::this_thread::sleep_for(std::chrono::seconds(5));
{
std::lock_guard<std::mutex> lk(cv_m);
std::cerr << "Notifying...\n";
}
cv.notify_all();
std::this_thread::sleep_for(std::chrono::seconds(5));
{
std::lock_guard<std::mutex> lk(cv_m);
i = 1;
std::cerr << "Notifying again...\n";
}
cv.notify_all();
}
int main()
{
std::thread t1(waits), t2(waits), t3(waits), t4(signals);
t1.join();
t2.join();
t3.join();
t4.join();
}
/*
Produce results in sequence:
1.thread t1,t2,t3 are waiting
Waiting...
Waiting...
Waiting...
2. broadcast after 5 s
Notifying...
3. broadcast after another 5 s
Notifying again...
4. thread t1,t2,t3 are unlocked
...finished waiting. i == 1
...finished waiting. i == 1
...finished waiting. i == 1
*/