Я создал следующую программу-пример для работы с Boost Threading:
#pragma once
#include "boost\thread\mutex.hpp"
#include <iostream>
class ThreadWorker
{
public:
ThreadWorker() {}
virtual ~ThreadWorker() {}
static void FirstCount(int threadId)
{
boost::mutex::scoped_lock(mutex_);
static int i = 0;
for(i = 1; i <= 30; i++)
{
std::cout << i << ": Hi from thread: " << threadId << std::endl;
}
}
private:
boost::mutex mutex_;
};
основной класс:
// ThreadTest.cpp
#include "stdafx.h"
#include "boost\thread\thread.hpp"
#include "ThreadWorker.h"
int _tmain(int argc, _TCHAR* argv[])
{
boost::thread thread1(&ThreadWorker::FirstCount, 1);
boost::thread thread2(&ThreadWorker::FirstCount, 2);
boost::thread thread3(&ThreadWorker::FirstCount, 3);
thread1.join();
thread2.join();
thread3.join();
std::string input;
std::cout << "Press <enter> to finish...\n";
std::getline( std::cin, input );
return 0;
}
Когда я запускаю это, я получаю следующий вывод:
1: Hi from thread: 1
1: Hi from thread: 3
2: Hi from thread: 3
...
Похоже, что поток 1 сначала идет туда, а затем поток 3. Разве scoped_lock не должен препятствовать тому, чтобы другие потоки входили в этот раздел кода? Разве первый поток, который запускает FirstCount (), не должен завершиться?
UPDATE
Одна вещь, которую я считаю неправильной в моем коде, это строка:
boost::mutex::scoped_lock(mutex_);
Я думаю, что это должно быть как:
boost::mutex::scoped_lock xyz(mutex_);
Как только я это делаю, он начинает жаловаться на то, что mutex_ не статичен. Почему это сработало в первую очередь, я не уверен. Изменение mutex_ на static дает мне ошибку компоновки:
1> ThreadWorker.obj: ошибка LNK2001: неразрешенный внешний символ
"private: повышение статического класса :: mutex ThreadWorker :: mutex_"
(? Mutex_ @ ThreadWorker @@ 0Vmutex @ импульс @@ A)
1> c: \ something \ ThreadTest \ Debug \ ThreadTest.exe: фатальная ошибка LNK1120:
1 неразрешенное внешнее
Все еще играю с ним.