我有一個動態庫內的邏輯運行一些服務,是由主要的可執行文件請求。如何避免等待pthread_cond_t信號已發送
從庫代碼中調用start_service
後,需要做好一些準備工作,在此期間,主代碼不應嘗試訪問該服務。
要在服務準備就緒時通知主代碼,我使用條件變量併發信號通知主可執行文件。
在主代碼等待條件變量之前,我希望聽到一些關於處理庫變得可用時的情況的最佳方法的建議。在這種情況下,等待能夠天長地久......
這裏的服務代碼:
extern pthread_cond_t cnd;
extern pthread_mutex_t mtx;
void start_service()
{
// getting serviceable.
pthread_cond_signal(&cnd);
main_loop();
}
而這裏的主代碼。
pthread_cond_t cnd;
pthread_mutex_t mtx;
int main()
{
pthread_cond_init(&cnd,NULL);
pthread_mutex_init(&mtx, NULL);
std::thread mytrd(&start_service);
...
pthread_mutex_lock(&mtx);
pthread_cond_wait(&cnd, &mtx); // what happens if we get here after the signal already sent.
pthread_mutex_unlock(&mtx);
...
}
P.S期望的行爲應該是主代碼避免等待條件變量,如果它已經發信號。
您可以使用的'0'初始計數信號量,所以主要被阻塞,直到'start_service()'增加信號計數爲'1'.If主,'start_service塊調用之前() '將信號計數增加到'1',主要不會進入等待狀態。 –
嗨,感謝您的評論,它似乎是一個合適的方式..也許你可以修改我的代碼來表達你的想法? – Zohar81
pthread_wait **必須總是**在循環中使用,它具有它等待的條件。不使用循環是不好的做法,可能會在任何時候失敗。 – geza