Tôi muốn đợi một luồng gồm 2 luồng được thực thi trong một trình mô phỏng Đồng thời cho đến khi điều kiện xảy ra, có thể xảy ra tình trạng sau 1000 hoặc nhiều chu kỳ chạy chương trình trong trình mô phỏng , sau khi tình trạng xảy ra chuỗi chờ đợi được thực hiện một lần nữa, làm thế nào tôi có thể làm điều đó?chờ đợi chủ đề cho đến khi một điều kiện đã xảy ra
Trả lời
Bạn cần các biến có điều kiện.
Nếu trình biên dịch của bạn hỗ trợ std::conditional
được giới thiệu bởi C++ 11, sau đó bạn có thể thấy điều này để xem chi tiết:
Nếu trình biên dịch của bạn không hỗ trợ nó, và bạn làm việc với đề win32, sau đó thấy điều này:
Và here là ví dụ hoàn chỉnh.
Và nếu bạn làm việc với chủ đề POSIX, sau đó thấy điều này:
Bạn có thể thấy thực hiện của tôi conditional_variable
sử dụng nguyên thủy win32 đây:
Cuộn xuống và xem triển khai thực hiện trước, sau đó xem cách sử dụng trong triển khai hàng đợi đồng thời.
Cách sử dụng điển hình của biến có điều kiện là:
//lock the mutex first!
scoped_lock myLock(myMutex);
//wait till a condition is met
myConditionalVariable.wait(myLock, CheckCondition);
//Execute this code only if the condition is met
nơi CheckCondition
là một chức năng (hoặc functor) mà kiểm tra điều kiện. Nó được gọi bằng cách wait()
chức năng nội bộ khi nó giả mạo tỉnh dậy và nếu điều kiện chưa được đáp ứng, chức năng wait()
sẽ hoạt động trở lại. Trước khi đi ngủ, wait()
phát hành mutex, nguyên tử.
Nếu bạn không có C++ 11, nhưng bạn có một hệ thống hỗ trợ chủ đề POSIX, thì bạn có thể sử dụng biến điều kiện. Có nhiều lựa chọn khác, nhưng biến điều kiện có thể là chuyển tiếp thẳng thắn nhất theo cách bạn mô tả vấn đề của mình.
Biến điều kiện pthread được sử dụng cùng với một mutex. Bí quyết với biến điều kiện là chờ đợi trên nó gây ra các mutex mua lại được phát hành, cho đến khi cuộc gọi chờ đợi trở lại, tại thời điểm đó mutex đã được mua lại.Trình tự là:
- Acquire mutex
- trong khi vị là không đúng sự thật
- chờ đợi trên biến điều kiện
- làm việc trên phần quan trọng
- nếu vị là đúng
- biến điều kiện tín hiệu
- phát hành mutex
Bước tín hiệu được sử dụng trong trường hợp nhiều luồng đang bước vào phần quan trọng cùng ở trên.
Nếu một chủ đề khác có thể truy cập cùng một mutex để sửa đổi trạng thái ảnh hưởng đến PREDICATE, chuỗi đó nên kiểm tra xem có ai cần được báo hiệu hay không.
- Acquire mutex
- làm việc trên phần quan trọng
- nếu vị là đúng
- biến tình trạng tín hiệu
- phát hành mutex
Các lệnh POSIX quan tâm là :
pthread_mutex_init()
pthread_mutex_destroy()
pthread_mutex_lock()
pthread_mutex_unlock()
pthread_cond_init()
pthread_cond_destroy()
pthread_cond_wait()
pthread_cond_signal()
Sử dụng Semaphore để báo hiệu. Ví dụ (ứng dụng thoát sạch) như sau:
Declare trong tiêu đề
static sem_t semPrepareExit; //declaration
Trong nguồn (chủ đề chính);
sem_init(&semPrepareExit, 0, 0); ///semaphore initialized
...
///now wait for the signal on the semaphore, to proceed hereforth
sem_post(&semPrepareExit);
/// cleanup ahead
...
Trong nguồn, (sinh ra luồng);
...
sem_post(&semPrepareExit);
Bây giờ, ngay khi bạn phát tín hiệu trên semaphore sử dụng "sem_post". Chủ đề chính sẽ nhận tín hiệu tại nút chờ/điểm, và sẽ tiếp tục, ở đó.
thử một cái gì đó như thế này:
class CmyClass
{
boost::mutex mtxEventWait;
bool WaitForEvent(long milliseconds);
boost::condition cndSignalEvent;
};
bool CmyClass::WaitForEvent(long milliseconds)
{
boost::mutex::scoped_lock mtxWaitLock(mtxEventWait);
boost::posix_time::time_duration wait_duration = boost::posix_time::milliseconds(milliseconds);
boost::system_time const timeout=boost::get_system_time()+wait_duration;
return cndSignalEvent.timed_wait(mtxEventWait,timeout); // wait until signal Event
}
// để inorder để chờ đợi sau đó gọi phương thức WaitForEvent
WaitForEvent(1000); // it will timeout after 1 second
// đây là làm thế nào một sự kiện có thể được hiệu:
cndSignalEvent.notify_one();
Tra cứu các biến có điều kiện và các ẩn dụ. –
Ngoài ra, hãy xem lời hứa và tương lai (http://en.cppreference.com/w/cpp/thread/promise) –