我是通过在drdobbs.com升压互斥教程阅读,发现这段代码:升压互斥锁作用域
#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;
}
现在我明白了一个互斥的一点是要防止两个线程访问同一资源,但我没有看到io_mutex和std :: cout之间的关联。这段代码是否锁定了范围内的所有内容,直到范围完成?
是的,'scoped_lock'锁定互斥锁,直到范围退出。它有一个相当直观的名字。 – juanchopanza
@juanchopanza我明白,scoped_lock的部分非常有意义。我没有得到的是互斥体和程序中其他任何东西之间的关系。它与程序中的执行顺序更相关,与实际内存相比更少?对不起,如果这是一个noob问题,但我一直在努力学习过去一周左右的互斥体,而没有得到它。 –
@ jlw2387:正如我在回答中所写,'std :: cout'是一个全局对象,所以你可以将它看作一个共享资源。同时从不同线程访问共享资源需要同步。这就是'scoped_lock'的作用 –