boost::scoped_lock 似乎没有锁定 std::cout
boost::scoped_lock appears not to lock std::cout
我使用的是 boost 1.54.0 和 Visual Studio 2010。对于代码:
#include <iostream>
#include "boost/thread/thread.hpp"
#include "boost/thread/mutex.hpp"
boost::mutex mx1;
void func1()
{
{
boost::mutex::scoped_lock(mx1);
std::cout << "Thread " << boost::this_thread::get_id() << " starting work." << std::endl;
}
int x = 0;
for (int i=0; i<100; i++)
x++;
{
boost::mutex::scoped_lock(mx1);
std::cout << "Thread " << boost::this_thread::get_id() << " finished." << std::endl;
}
}
int main(void)
{
boost::thread thread1(&func1);
boost::thread thread2(&func1);
thread1.join();
thread2.join();
return 0;
}
大约一半的时间我得到以下结果(显然有不同的线程 ID 和执行顺序):
Thread Thread 15b0 starting work.
1a18 starting work.
Thread 15b0 finished.
Thread 1a18 finished.
...而不是这个(这是我所期望的):
Thread 15b0 starting work.
Thread 1a18 starting work.
Thread 15b0 finished.
Thread 1a18 finished.
但是,使用
mx1.lock();
std::cout << "Thread " << boost::this_thread::get_id() << " starting work." << std::endl;
mx1.unlock();
...似乎工作没有问题。
输出似乎总是遵循相同的模式。我是否错误地使用了互斥锁,或者它与 std::cout?
有关
替换
boost::mutex::scoped_lock(mx1);
和
boost::mutex::scoped_lock lock(mx1);
你成为了范围锁最常出现的拼写错误的受害者:-)
我使用的是 boost 1.54.0 和 Visual Studio 2010。对于代码:
#include <iostream>
#include "boost/thread/thread.hpp"
#include "boost/thread/mutex.hpp"
boost::mutex mx1;
void func1()
{
{
boost::mutex::scoped_lock(mx1);
std::cout << "Thread " << boost::this_thread::get_id() << " starting work." << std::endl;
}
int x = 0;
for (int i=0; i<100; i++)
x++;
{
boost::mutex::scoped_lock(mx1);
std::cout << "Thread " << boost::this_thread::get_id() << " finished." << std::endl;
}
}
int main(void)
{
boost::thread thread1(&func1);
boost::thread thread2(&func1);
thread1.join();
thread2.join();
return 0;
}
大约一半的时间我得到以下结果(显然有不同的线程 ID 和执行顺序):
Thread Thread 15b0 starting work.
1a18 starting work.
Thread 15b0 finished.
Thread 1a18 finished.
...而不是这个(这是我所期望的):
Thread 15b0 starting work.
Thread 1a18 starting work.
Thread 15b0 finished.
Thread 1a18 finished.
但是,使用
mx1.lock();
std::cout << "Thread " << boost::this_thread::get_id() << " starting work." << std::endl;
mx1.unlock();
...似乎工作没有问题。
输出似乎总是遵循相同的模式。我是否错误地使用了互斥锁,或者它与 std::cout?
有关替换
boost::mutex::scoped_lock(mx1);
和
boost::mutex::scoped_lock lock(mx1);
你成为了范围锁最常出现的拼写错误的受害者:-)