【发布时间】:2013-05-28 18:45:34
【问题描述】:
我正在阅读 drdobbs.com 上的 Boost Mutex 教程,并找到了这段代码:
#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/bind.hpp>
#include <iostream>
boost::mutex io_mutex;
void count(int id)
{
for (int i = 0; i < 10; ++i)
{
boost::mutex::scoped_lock
lock(io_mutex);
std::cout << id << ": " <<
i << std::endl;
}
}
int main(int argc, char* argv[])
{
boost::thread thrd1(
boost::bind(&count, 1));
boost::thread thrd2(
boost::bind(&count, 2));
thrd1.join();
thrd2.join();
return 0;
}
现在我明白了 Mutex 的意义在于防止两个线程同时访问同一个资源,但我没有看到 io_mutex 和 std::cout 之间的相关性。这段代码是否只是锁定范围内的所有内容,直到范围完成?
【问题讨论】:
-
是的,
scoped_lock锁定互斥体,直到退出作用域。它有一个相当直观的名称。 -
@juanchopanza 我理解这部分,scoped_lock 非常有意义。我没有得到的是互斥锁与程序中其他任何东西之间的关系。它是否与程序中的执行顺序更相关,而与实际内存的关系更少?抱歉,如果这是一个菜鸟问题,但过去一周左右我一直在尝试学习互斥锁,但没有得到它。
-
@jlw2387:正如我在回答中所写,
std::cout是一个全局对象,因此您可以将其视为共享资源。从不同线程并发访问共享资源需要同步。这就是scoped_lock正在做的事情
标签: c++ multithreading boost mutex scoped-lock