【问题标题】:boost::scoped_lock appears not to lock std::coutboost::scoped_lock 似乎没有锁定 std::cout
【发布时间】:2016-03-21 17:13:04
【问题描述】:

我正在使用 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 有关?

【问题讨论】:

    标签: c++ multithreading boost mutex boost-mutex


    【解决方案1】:

    替换

        boost::mutex::scoped_lock(mx1);
    

        boost::mutex::scoped_lock lock(mx1);
    

    你成为了使用范围锁最常见的错字的受害者:-)

    【讨论】:

    • 谢谢! :D 现在很明显,我看到了问题!我想您需要在特定范围内声明一个对象,以使该对象超出范围。
    • 你并不孤单!
    猜你喜欢
    • 2023-03-26
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    相关资源
    最近更新 更多