tôi gặp sự cố với thứ tự thực hiện các chuỗi được tạo liên tục. đây là mã.boost :: đề xuất thực hiện yêu cầu
#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;
}
mỗi lần một chữ cái (từ A đến D) và id chi (i) được chuyển cho phương thức SomeWork làm chuỗi. tôi không quan tâm về thứ tự thực hiện giữa các chữ cái nhưng đối với một lá thư prticular, nói A, Ax phải bắt đầu trước khi Ay, nếu x < y. một phần ngẫu nhiên của một đầu ra ngẫu nhiên của mã là:
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
làm cách nào để tránh các điều kiện như vậy?
cảm ơn.
tôi đã giải quyết vấn đề bằng cách sử dụng các biến điều kiện. nhưng tôi đã thay đổi vấn đề một chút. giải pháp là theo dõi chỉ số vòng lặp for. do đó, mỗi thread biết khi nào nó không hoạt động. nhưng theo như mã này là có liên quan, có hai điều khác mà tôi muốn hỏi về.
trước tiên, trên máy tính của tôi, khi tôi đặt chỉ số vòng lặp thành 350 tôi đã vi phạm quyền truy cập. 310 là số vòng lặp, là ok. vì vậy tôi nhận ra rằng có một số lượng tối đa các luồng được tạo ra. làm thế nào tôi có thể xác định con số này? giây, trong phòng thu trực quan 2008, phiên bản phát hành của mã cho thấy một hành vi thực sự kỳ lạ. mà không sử dụng biến điều kiện (dòng 1 đến 3 đã được nhận xét), các chủ đề đã được sắp xếp. làm thế nào điều đó có thể xảy ra?
đây là mã:
#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;
}
ý của các đơn vị công việc là gì? –
Một số biểu diễn của một tác phẩm sẽ được thực hiện bởi một chuỗi. Trong trường hợp này, một đơn vị làm việc về cơ bản sẽ là một cặp '(thư, chỉ mục)'. – Gian