线程A负责打印数组 线程B负责向数组中push一个元素,做到每push10个元素 线程A就执行一次打印。
这个问题可以用生产者消费者模型来解决。
#include <iostream>
#include <mutex>
#include <vector>
#include <thread>
#include <time.h>
using namespace std;
volatile int g_count = 10;
mutex lock_;
condition_variable cond_;
condition_variable cond2_;
vector<int> arr_;
void print_func()
{
while (1)
{
unique_lock<mutex> lock(lock_);
while (g_count > 0) {
cond_.wait(lock_);
}
cout << "haha: " << arr_.size() << endl;
g_count = 10;
arr_.clear();
cond2_.notify_all();
}
}
void push_func()
{
while(1)
{
unique_lock<mutex> lock(lock_);
while (g_count == 0){
cond2_.wait(lock_);
}
arr_.push_back(1);
g_count--;
sleep(1);
cout << "push count: " << g_count << endl;
if(g_count == 0)
{
cond_.notify_all();
}
}
}
int main(int argc, const char * argv[]) {
// insert code here...
std::cout << "Hello, World!\n";
thread print_thread(print_func);
thread push_thread(push_func);
print_thread.join();
push_thread.join();
return 0;
}
代码总结:
条件变量的使用:
- 条件变量是在
拿到锁
之后才能使用的,在调用条件变量时,会将拿到的锁释放掉,然后线程就处于等待状态,直到条件满足(收到信号),然后返回时会继续把锁锁定。 - 条件变量处一定要用while,不能使用if判断,因为在条件满足以后,其他线程可能会通过广播的方式来通知所有线程条件满足,此时,可能会有其他线程已经最公共变量进行修改了,需要对公共变量继续判断之后再继续运行。
- 在条件满足并执行任务后,一定要释放锁再发消息,原因是,其他等待线程在条件等待处返回时,会将锁锁上,如果未释放锁,则条件满足的线程仍然会处于等待状态。