我做了下面的示例程序與提升線程玩:boost :: scoped_lock不能使用本地靜態變量?
#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_的投訴不是靜態的。爲什麼它首先在我不確定的地方工作。將互斥鎖變爲靜態會給我一個鏈接錯誤:
1>ThreadWorker.obj : error LNK2001: unresolved external symbol "private: static class boost::mutex ThreadWorker::mutex_" ([email protected]@@[email protected]@@A) 1>c:\something\ThreadTest\Debug\ThreadTest.exe : fatal error LNK1120: 1 unresolved externals
仍然在玩它。
該代碼不能編譯。在實際代碼中,'mutex_'是類中的一個靜態成員嗎? –
'static int i'本質上是一個共享的全局變量,它不受保護(它受不同的互斥鎖保護......) – sehe
它在Visual Studio 2010 C++中爲我編譯。我已經嘗試使mutex_既是靜態的也是非靜態的。無論哪種方式代碼編譯我和任何方式的結果是相同的。 – User