对C++11条件变量的理解(逻辑)

来源:互联网 发布:seo h1标签用法 编辑:程序博客网 时间:2024/06/04 18:13

之前对条件变量一直抱有疑惑,通过互斥锁已经能够保证同一时刻只有一个线程访问共享区资源了,那还要用条件变量干什么呢?说到这里,解惑来源于这篇文章c++11线程之条件变量condition_variable,互斥锁只能保证线程不同时访问共享区资源,但是访问的顺序是杂乱无章的,而条件变量是为了保证线程操作按顺序进行。
还有,条件变量std::condition_variable::wait(std::unique& lck)函数在调用的时候会释放锁lck(调用lck.unlock()),在其他线程调用notify_all()(此处也可以是其他唤醒函数)后线程停止阻塞,继续执行,但是此时线程使用的wait()会将lck恢复到阻塞之前的状态,也就是加锁,之前一直百思不得其解,还一直纠结这个代码为什么没有死锁`#include // std::cout

include // std::thread

include // std::mutex, std::unique_lock

include // std::condition_variable

std::mutex mtx;
std::condition_variable cv;

int cargo = 0; // shared value by producers and consumers

void consumer()
{
std::unique_lock < std::mutex > lck(mtx);
while (cargo == 0)
cv.wait(lck);//阻塞
std::cout << cargo << ‘\n’;
cargo = 0;
}
void producer(int id)
{
//std::unique_lock < std::mutex > lck(mtx);
cargo = id;
cv.notify_one();//唤醒某一个线程
}

int main()
{
std::thread consumers[10], producers[10];

// spawn 10 consumers and 10 producers:for (int i = 0; i < 10; ++i) {    consumers[i] = std::thread(consumer);    producers[i] = std::thread(producer, i + 1);}// join them back:for (int i = 0; i < 10; ++i) {    producers[i].join();    consumers[i].join();}return 0;

}`,其实,条件变量在使得当前线程阻塞时,是拥有了一个锁的,如果不释放该锁,则当前线程会阻塞,而且其他线程也会因为该锁二阻塞,这就导致所有线程均阻塞,这是我们不想看到的结果,我们需要其他线程在当前线程阻塞时继续执行,从而触发当前线程被唤醒;在当前线程被唤醒后,需要加锁,这是因为当前线程已经进入资源共享区,需要放置其他线程也进来访问,所以加锁,如此便保证了顺序(逻辑上的顺序)访问。

0 0
原创粉丝点击