Tôi có hai chủ đề cố khóa cùng một số boost::mutex
. Một trong những chủ đề đó liên tục xử lý một số dữ liệu và phần còn lại sẽ hiển thị định kỳ trạng thái hiện tại. Các chủ đề xử lý, theo ý định của tôi, phát hành khóa rất thường xuyên và reacquires nó, để các chủ đề hiển thị có thể gõ vào và có được nó bất cứ khi nào nó cần nó. Vì vậy, rõ ràng, tôi muốn các sợi hiển thị để có được khóa thời gian tiếp theo nó được phát hành bởi các chủ đề quá trình. Tuy nhiên, nó không làm điều đó, thay vào đó, nó chờ khóa và chỉ mua lại nó sau nhiều chu kỳ nhả khóa từ dây chuyền xử lý.Mua khóa ngay khi có sẵn
Hãy kiểm tra ví dụ nhỏ minh họa vấn đề của tôi:
#include <boost/thread.hpp>
#include <iostream>
using namespace std;
using namespace boost;
mutex mut;
void process() {
double start = time(0);
while(1) {
unique_lock<mutex> lock(mut);
this_thread::sleep(posix_time::milliseconds(10));
std::cout<<".";
if(time(0)>start+10) break;
}
}
int main() {
thread t(process);
while(!t.timed_join(posix_time::seconds(1))) {
posix_time::ptime mst1 = posix_time::microsec_clock::local_time();
cout<<endl<<"attempting to lock"<<endl;
cout.flush();
unique_lock<mutex> lock(mut);
posix_time::ptime mst2 = posix_time::microsec_clock::local_time();
posix_time::time_duration msdiff = mst2 - mst1;
cout << std::endl<<"acquired lock in: "<<msdiff.total_milliseconds() << endl;
cout.flush();
}
}
Biên soạn với: g++ mutextest.cpp -lboost_thread -pthread
Khi tôi chạy file thực thi, một đầu ra mẫu là như thế này:
...................................................................................................
attempting to lock
....................................................................................................................................................................................................................................................................................................................................................................................................................................
acquired lock in: 4243
...................................................................................................
attempting to lock
........................................................................................................
acquired lock in: 1049
...................................................................................................
attempting to lock
........................................................................................................................
acquired lock in: 1211
....................................
Như bạn có thể thấy, trong trường hợp xấu nhất, màn hình hiển thị chờ đợi cho 424 chu kỳ khóa-phát hành trước khi nó đến vòng để bắt khóa.
Tôi rõ ràng đang sử dụng mutex theo cách sai, nhưng cách thông thường để giải quyết vấn đề này là gì?
bên cạnh nghi phạm thông thường: (biến điều kiện, năng suất,) thử một số container an toàn thread ... – NoSenseEtAl