1

ブースト 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 と関係がありますか?

4

1 に答える 1

6

交換

    boost::mutex::scoped_lock(mx1);

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

スコープ付きロックで最も頻繁に発生するタイプミスの犠牲者になりました:-)

于 2016-03-21T17:16:08.153 に答える