我對順序創建的線程的執行順序有問題。 這裏是代碼。boost ::線程執行順序
#include <iostream>
#include <Windows.h>
#include <boost/thread.hpp>
using namespace std;
boost::mutex mutexA;
boost::mutex mutexB;
boost::mutex mutexC;
boost::mutex mutexD;
void SomeWork(char letter, int index)
{
boost::mutex::scoped_lock lock;
switch(letter)
{
case 'A' : lock = boost::mutex::scoped_lock(mutexA); break;
case 'B' : lock = boost::mutex::scoped_lock(mutexB); break;
case 'C' : lock = boost::mutex::scoped_lock(mutexC); break;
case 'D' : lock = boost::mutex::scoped_lock(mutexD); break;
}
cout << letter <<index << " started" << endl;
Sleep(800);
cout << letter<<index << " finished" << endl;
}
int main(int argc , char * argv[])
{
for(int i = 0; i < 16; i++)
{
char x = rand() % 4 + 65;
boost::thread tha = boost::thread(SomeWork,x,i);
Sleep(10);
}
Sleep(6000);
system("PAUSE");
return 0;
}
每次將一個字母(從A到D)和一個genereaion id(i)傳遞給SomeWork作爲線程的方法。我不關心字母之間的執行順序,但是對於特定的字母,如A,Ax必須在Ay之前開始,如果x < y。 代碼的隨機輸出的一個隨機部分是:
B0 started D1 started C2 started A3 started B0 finished B12 started D1 finished D15 started C2 finished C6 started A3 finished A9 started B12 finished B11 started --> B11 started after B12 finished. D15 finished D13 started C6 finished C7 started A9 finished
如何避免這種情況?
謝謝。
我使用條件變量解決了這個問題。但我改變了一些問題。解決方案是跟蹤for循環的索引。所以每個線程知道什麼時候不工作。但就這個代碼而言,我還想問一下另外兩件事情。
首先,在我的電腦上,當我將for-loop索引設置爲350時,我有訪問衝突。 310是循環的數量,這是可以的。所以我意識到有最大數量的線程要生成。我如何確定這個數字?其次,在Visual Studio 2008中,代碼的發佈版本顯示出一種非常奇怪的行爲。如果不使用條件變量(第1行至第3行被註釋掉),那麼線程就會被排序。這怎麼可能發生?
這裏是代碼:
#include <iostream>
#include <Windows.h>
#include <boost/thread.hpp>
using namespace std;
boost::mutex mutexA;
boost::mutex mutexB;
boost::mutex mutexC;
boost::mutex mutexD;
class cl
{
public:
boost::condition_variable con;
boost::mutex mutex_cl;
char Letter;
int num;
cl(char letter) : Letter(letter) , num(0)
{
}
void doWork(int index, int tracknum)
{
boost::unique_lock<boost::mutex> lock(mutex_cl);
while(num != tracknum) // line 1
con.wait(lock); // line 2
Sleep(10);
num = index;
cout << Letter<<index << endl;
con.notify_all(); // line 3
}
};
int main(int argc , char * argv[])
{
cl A('A');
cl B('B');
cl C('C');
cl D('D');
for(int i = 0; i < 100; i++)
{
boost::thread(&cl::doWork,&A,i+1,i);
boost::thread(&cl::doWork,&B,i+1,i);
boost::thread(&cl::doWork,&C,i+1,i);
boost::thread(&cl::doWork,&D,i+1,i);
}
cout << "************************************************************************" << endl;
Sleep(6000);
system("PAUSE");
return 0;
}
你的工作單位是什麼意思? – 2010-09-03 13:30:10
線程完成一部分工作的一些表示。在這種情況下,一個工作單位基本上是一個「(字母,索引)」對。 – Gian 2010-09-03 13:48:34