Boost互斥锁作用域锁
Boost Mutex Scoped Lock
我正在阅读drdobbs.com上的Boost互斥锁教程,并发现了这段代码:
#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之间的关系。这段代码只是锁定作用域内的所有内容,直到作用域结束吗?
现在我明白了互斥锁的意义是防止两个线程同时访问同一个资源,但是我不明白io_mutex和std::cout之间的关系。
std::cout
是一个全局对象,因此您可以将其视为共享资源。如果你从多个线程并发访问它,这些访问必须以某种方式同步,以避免数据竞争和未定义的行为。
考虑以下情况,也许您会更容易注意到并发访问的发生:
std::cout << x
实际上相当于:
::operator << (std::cout, x)
这意味着你正在调用一个对std::cout
对象进行操作的函数,并且你同时在不同的线程中这样做。std::cout
必须被保护起来。但这并不是scoped_lock
存在的唯一原因(继续阅读)。
这段代码只是锁定作用域内的所有内容,直到作用域完成?
是的,它锁定io_mutex
,直到锁定对象本身超出范围(作为典型的RAII包装器),这发生在for循环的每次迭代结束时。
为什么需要它?好吧,尽管在c++ 11中,对cout
的单独插入保证是线程安全的,但是当几个线程输出一些东西时,随后的单独插入可能会交错。
请记住,通过operator <<
进行的每次插入都是一个单独的函数调用,就好像您在做:
std::cout << id;
std::cout << ": ";
std::cout << i;
std::cout << endl;
operator <<
返回流对象的事实允许您在单个表达式中链接上述函数调用(就像您在程序中所做的那样),但是您有几个单独的函数调用的事实仍然成立。
<id> ": " <index> <endl>
打印时,其部分不与其他消息的部分交叉。
同样,在c++ 03中(对cout
的插入不能保证是线程安全的),锁将保护cout
对象本身不被并发访问。
互斥锁与程序中的其他内容无关(条件变量除外),至少在更高的级别。互斥锁有两种作用:它控制程序流,并防止多个线程执行相同的代码块同时进行。它还确保内存同步。的这里重要的问题是,互斥锁与资源,并且不会阻止两个线程访问相同的资源资源。互斥锁定义了一个临界区一次只能由一个线程输入的代码。如果特定资源的所有使用都是在临界状态下完成的节由同一互斥锁控制,则资源为被互斥锁有效保护。但是关系是由编码器建立,通过确保所有的使用都采取放置在临界区域。
- 未在作用域中声明unordered_map
- 有没有一种方法可以在编译时获得作用域类名
- C++quit()函数中可能存在作用域问题
- 未在此作用域OpenCV3.4中声明cvSaveImage
- 全局作用域中函数指针的赋值
- 在类函数中初始化外部作用域变量
- 不同作用域中的静态变量和全局变量
- 是同一作用域的函数部分中的函数调用
- 未在此作用域中声明的函数和变量 (C++)
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 将作用域枚举转换为基础类型
- 表达式必须具有完整或无作用域的枚举图
- 在构造函数中输入对象时C++类成员作用域
- 无法让"std::enable_if"适用于无作用域枚举
- 我的boost managed_shared_memory在离开作用域时似乎不会从内存空间中取消映射
- Boost作用域指针指向Boost线程
- 公开私人作用域Boost.BiMap迭代器的公共视图
- C++:Boost::互斥锁分别锁定同一作用域中的多个变量
- Boost互斥锁作用域锁
- 强制超出作用域boost::bind失败