Tôi hiện đang nghiên cứu một vấn đề mô phỏng một mô hình Công nhân sản xuất mở rộng. Trong vấn đề này có 3 công nhân và 3 công cụ có sẵn, và cho công nhân làm việc họ cần 2 công cụ (và vật liệu nhưng những thứ đó không liên quan). Nếu có> = 2 công cụ trong hầm, nhân viên sẽ lấy 2. Khác, họ sẽ đợi trên biến điều kiện sẽ được báo hiệu khi có> = 2.C++ 11 Chủ đề: Nhiều chủ đề đang chờ trên biến điều kiện
Điều này là tốt với 2 công nhân: một người sẽ làm việc sau đó trả lại công cụ cho hầm, và công nhân chờ đợi khác sẽ được đánh thức và có 2 công cụ. Vấn đề là, với 3 công nhân, sẽ luôn có một người chết đói để có được các công cụ.
Sau một số thử nghiệm, tôi nhận thấy rằng các chuỗi đang chờ biến điều kiện được cấu trúc theo dạng ngăn xếp. Có cách nào có thể làm cho nó xếp hàng đợi? (1 lần chờ đợi, 2 lần chờ đợi và 3 lần chờ đợi khi 1 được đánh thức và muốn thực hiện một thiết bị khác, anh phải đợi sau 2 và 3.)
Dưới đây là một đầu ra mẫu. Mã quá dài nên tôi sẽ đăng nó nếu nó thực sự cần thiết. Có 3 chủ đề công nhân và 1 công cụ mutex. Ai đói là khác nhau chạy.
1 Tools taken. Remaining: 1
2 Waiting on tools...
3 Waiting on tools...
1 Operator Product made. Tools returned. Tools now:3
3 Tools taken. Remaining: 1
1 Waiting on tools...
3 Materials returned for switch.
3 Operator Product made. Tools returned. Tools now:3
1 Tools taken. Remaining: 1
3 Waiting on tools...
1 Materials returned for switch.
1 Operator Product made. Tools returned. Tools now:3
3 Tools taken. Remaining: 1
1 Waiting on tools...
3 Materials returned for switch.
3 Operator Product made. Tools returned. Tools now:3
1 Tools taken. Remaining: 1
3 Waiting on tools...
1 Materials returned for switch.
1 Operator Product made. Tools returned. Tools now:3
3 Tools taken. Remaining: 1
1 Waiting on tools...
3 Materials returned for switch.
3 Operator Product made. Tools returned. Tools now:3
1 Tools taken. Remaining: 1
3 Waiting on tools...
1 Materials returned for switch.
...
(Như bạn có thể thấy 2 không bao giờ được các công cụ ...)
Cập nhật: 2013/07/05 Tôi đã thêm một số mã.
int tools = 3; //global
string last; //current last product on output buffer
mutex toolsMutex;
mutex matSearchMutex;
int main(){
//Initializing Producers
Producer prod1(1);
Producer prod2(2);
Producer prod3(3);
thread p1(processor,1);
thread p2(processor,2);
thread p3(processor,3);
p1.detach();
p2.detach();
p3.detach();
while(true){//forever running
}
return 0;
}
Processor:
//Processor method
void processor(int i){
srand(time(NULL));
while (true){ //forever running
bool hasTools = false;
bool productMade = false;
while (productMade == false){ //while product has yet to be made.
//choose what to make...
if (hasTools == false){
thread matT(getMaterials,whatToMake);
thread toolT(getTools,i);
toolT.join();
matT.join();
hasTools = true;
}
else{ //tools acquired but no materials
thread matT(getMaterials,whatToMake);
matT.join();
}
if (recordedLast.compare(last) != 0){
//return materials and acquire new ones the next run
continue;
}
else {
makeProduct(whatToMake);
unique_lock<mutex> locker(toolMutex);
tools = tools + 2;
cout << i << " Operator Product made. Tools returned. Tools now:" << tools << endl;
productMade = true;
if (tools >=2) toolsCV.notify_one();
}
//done processing
}
}
}
makeProducts:
void makeProduct(int i){
unique_lock<mutex> mainMatLock(matSearchMutex);
// make product according to i
this_thread::sleep_for(chrono::milliseconds(rand() % 1000 + 10));
}
getTools:
void getTools(int i){
unique_lock<mutex> locker(toolMutex);
if (tools <2){
cout << i << " Waiting on tools..." << endl;
toolsCV.wait(locker);}
tools = tools - 2;//tools acquired
cout << i <<" Tools taken. Remaining: " << tools << endl;
}
Nhờ có những người đã trả lời. Tôi sẽ cố gắng thực hiện một hàng chờ đợi tối nay bằng cách sử dụng nhiều biến điều kiện.
(PS Có một số cách tốt hơn để làm mã định dạng ở đây trên Stack Overflow? Khác với bốn không gian ...
Tại sao bạn không đăng mã thực của mình? Bạn đã thử phát sóng trên biến điều kiện (so với tín hiệu) chưa? Bạn chưa chỉ định bất kỳ điều gì về môi trường của mình, nhưng có thể muốn xem qua http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_08_04_01 –
_ "Có cách nào tốt hơn để làm mã không định dạng ở đây trên Stack Overflow? "_ Nhập mã mà không có dấu cách sau đó làm nổi bật toàn bộ khối mã và nhấn Ctrl-K hoặc nhấn nút ** {} ** trên thanh công cụ phía trên hộp chỉnh sửa –