Tôi cần hai chuỗi để tiến hành theo mẫu "tick tock". Khi implmented với một semaphore này có vẻ tốt đẹp:Sử dụng mutex làm semaphore?
Semaphore tick_sem(1);
Semaphore tock_sem(0);
void ticker(void)
{
while(true)
{
P(tick_sem);
do_tick();
V(tock_sem);
}
}
void tocker(void)
{
while(true)
{
P(tock_sem);
do_tock();
V(tick_sem);
}
}
Tuy nhiên, nếu tôi làm điều tương tự với một mutex (đó là về mặt kỹ thuật một semaphore nhị phân), nó có một mã mùi kỳ lạ.
std::mutex tick_mutex;
std::mutex tock_mutex;
tock_mutex.lock();
void ticker(void)
{
while(true)
{
tick_mutex.lock();
do_tick();
tock_mutex.unlock();
}
}
void tocker(void)
{
while(true)
{
tock_mutex.lock()
do_tock();
tick_mutex.unlock();
}
}
Tôi nghĩ rằng mùi là một mutex không có nghĩa là truyền tải thông tin đến một chủ đề khác. (Ủy ban tiêu chuẩn C++ 11 thêm giả mạo không try_lock để đánh bại việc chuyển thông tin bất ngờ; §30.4.1/14.) Có vẻ như mutexes có nghĩa là đồng bộ hóa truy cập vào một biến, sau đó có thể chuyển tải thông tin đến một luồng khác.
Cuối cùng, khi được triển khai với std::condition_variable
, có vẻ đúng nhưng phức tạp hơn (biến tick_vs_tock, mutex và biến điều kiện). Tôi đã bỏ qua việc triển khai cho ngắn gọn, nhưng nó thực sự thẳng về phía trước.
Giải pháp mutex có ổn không? Hay có điều gì đó không đúng với nó?
Có cách nào tốt để giải quyết vấn đề đánh dấu/tock của tôi mà tôi chưa từng nghĩ đến?
BTW: vấn đề này chỉ phát sinh vì C++ 0x không có 'std :: semaphore' và giải pháp' std :: mutex' đôi phức tạp hơn giải pháp 'std :: condition_variable'. –
(Tại sao) nó thậm chí còn hợp lệ để 'mở khóa()' một mutex trong một chuỗi mà hiện tại không giữ nó? –
@Steve thực sự là câu hỏi hay (gợi ý, gợi ý, di chuyển, di chuyển). –