Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 增强互斥锁作用域锁_C++_Multithreading_Boost_Mutex_Scoped Lock - Fatal编程技术网

C++ 增强互斥锁作用域锁

C++ 增强互斥锁作用域锁,c++,multithreading,boost,mutex,scoped-lock,C++,Multithreading,Boost,Mutex,Scoped Lock,我正在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 <

我正在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;
}
#包括
#包括
#包括
#包括
boost::mutex io_mutex;
无效计数(整数id)
{
对于(int i=0;i<10;++i)
{
boost::mutex::作用域锁定
锁(io_互斥);
标准::cout
现在我明白了互斥的意义在于防止两个线程同时访问同一资源,但我看不到io_互斥和std::cout之间的相关性

std::cout
是一个全局对象,因此您可以将其视为一个共享资源。如果您从多个线程同时访问它,则必须以某种方式同步这些访问,以避免数据争用和未定义的行为

考虑到以下情况,您可能更容易注意到并发访问的发生:

std::cout << x

操作符互斥体与程序中的任何其他内容都没有关系
(条件变量除外),至少在更高级别。
互斥锁有两种效果:它控制程序流和防止
多个线程执行同一代码块
同时,它还确保了内存同步
这里的重要问题是互斥体与
资源,并且不阻止两个线程访问同一个线程
互斥体定义了一个关键部分
一次只能由一个线程输入的代码。如果
特定资源的所有使用都是在关键时刻完成的
由同一互斥体控制的节,则资源为
有效地受到互斥锁的保护。但是这种关系
由编码员确定,通过确保所有使用

放置在关键部分。

是的,
作用域锁定
锁定互斥体直到作用域退出。它有一个相当直观的名称。@juanchopanza我理解这一部分,作用域锁定非常有意义。我没有得到的是互斥体和程序中其他任何东西之间的关系。它与程序中的执行顺序更相关吗程序,而实际内存更少?如果这是一个noob问题,很抱歉,但我在过去一周左右一直在尝试学习互斥体,但没有得到它。@jlw2387:正如我在回答中所写的,
std::cout
是一个全局对象,因此您可以将其视为共享资源。从不同线程并发访问共享资源需要res同步。这就是
作用域锁定
所做的。我不确定您是否已经明确说明互斥锁锁定了代码的关键区域——执行路径,而不是任何资源或对象。关于C++11之前版本中
>
的线程安全性:这取决于实现。有些是线程安全的。我认为他们对你说的
std:]感到惊讶:cout@JamesKanze:这在§27.4.1/4中有规定。我想知道为什么。它没有给你买任何东西(正如你非常正确地指出的那样),而且它违反了图书馆其他地方使用的一般原则。(一种更有用的方法是提供流的互斥体成员,这样即使是互不了解的库也可以同意使用互斥体。)“互斥体锁定代码的关键区域——执行路径,而不是任何资源或对象”——错误。boost::mutex::scoped_lock构造函数(RAII的II部分)锁定传递给它的boost::mutex对象(RAII的RA部分)。任何数量的代码段都可以由同一个互斥锁锁定。例如,OP的程序可以在多个位置写入cout,每个位置都受同一个互斥锁保护。“我想知道为什么。”--所以在多个线程中不锁定地使用cout不会导致未定义的行为。你读过这一节吗?“正如你非常正确地指出的”--他没有这样做。
::operator << (std::cout, x)
std::cout << id;
std::cout << ": ";
std::cout << i;
std::cout << endl;
<id> ": " <index> <endl>