Skip to content

Commit 72fe1e2

Browse files
committed
update 5.4 Thread-synchronization-with-condition-variable
1 parent c89e5fc commit 72fe1e2

1 file changed

Lines changed: 67 additions & 1 deletion

File tree

Lines changed: 67 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,67 @@
1-

1+
## 利用条件变量进行线程同步 ##
2+
3+
在多线程同步时,条件变量通常和锁(Lock)一起使用。
4+
5+
请看下例([参考](http://en.cppreference.com/w/cpp/thread/condition_variable)):
6+
7+
#include <iostream>
8+
#include <string>
9+
#include <thread>
10+
#include <mutex>
11+
#include <condition_variable>
12+
13+
std::mutex m;
14+
std::condition_variable cv;
15+
std::string data;
16+
bool ready = false;
17+
bool processed = false;
18+
19+
void worker_thread()
20+
{
21+
// Wait until main() sends data
22+
{
23+
std::unique_lock<std::mutex> lk(m);
24+
cv.wait(lk, []{return ready;});
25+
}
26+
27+
std::cout << "Worker thread is processing data\n";
28+
data += " after processing";
29+
30+
// Send data back to main()
31+
{
32+
std::lock_guard<std::mutex> lk(m);
33+
processed = true;
34+
std::cout << "Worker thread signals data processing completed\n";
35+
}
36+
cv.notify_one();
37+
}
38+
39+
int main()
40+
{
41+
std::thread worker(worker_thread);
42+
43+
data = "Example data";
44+
// send data to the worker thread
45+
{
46+
std::lock_guard<std::mutex> lk(m);
47+
ready = true;
48+
std::cout << "main() signals data ready for processing\n";
49+
}
50+
cv.notify_one();
51+
52+
// wait for the worker
53+
{
54+
std::unique_lock<std::mutex> lk(m);
55+
cv.wait(lk, []{return processed;});
56+
}
57+
std::cout << "Back in main(), data = " << data << '\n';
58+
59+
worker.join();
60+
}
61+
62+
执行结果如下:
63+
64+
main() signals data ready for processing
65+
Worker thread is processing data
66+
Worker thread signals data processing completed
67+
Back in main(), data = Example data after processing

0 commit comments

Comments
 (0)