OS是Linux,使用pthreadspthreads,我怎麼知道進程內的另一個線程沒有在等待?
我有兩個永久運行的工作線程,直到stop變量的值爲true,並且線程正常終止。而不是忙於等待兩個線程調用pthread_cond_wait,直到信號通知新任務。該系統運作良好。
它被要求創建一個「info」線程來打印一些調試信息。信息線程將嘗試每30秒讀取和打印信息。部分信息,我想成爲每個工作線程的狀態。是否有可能找到一個線程是否被阻塞在「pthread_cond_wait」?如果線程等待是pthread_cond_wait,那麼STATE ==等待狀態==正在運行。
while ((sharedvaluffer == 0) && (doneflag == 0)) {
pthread_cond_wait (&taks_added, &buffer);
}
當然我們可以做到這一點,我們更多的代碼。我們可以在上面的代碼片段中添加一個全局變量, 將該線程標記爲鎖定。代碼可以做
while ((sharedvaluffer == 0) && (doneflag == 0)) {
lock;
i_am_waiting = truel
unlock
pthread_cond_wait (&taks_added, &buffer);
}
問題是,如果有一個更容易的可擴展的方式。等待線程的堆棧是
Thread 6 (Thread 0x40800940 (LWP 20732)):
#0 0x00002ba4567a9326 in [email protected]@GLIBC_2.3.2()
#1 0x00000000007ce2ed in worker(void*)()
#2 0x00002ba4567a5193 in start_thread() from /lib64/libpthread.so.0
#3 0x00002ba458a82f0d in clone() from /lib64/libc.so.6
如果工作人員正在鎖定某些互斥鎖(即在共享互斥體的情況下),則不起作用 – cateof
爲什麼不?每個線程都有自己的ID。保持一個可訪問的'pthread_t current_owner'並在工作線程每次獲得互斥量時更新它。您的信息線程然後將此變量與每個工作線程的ID進行比較。請記住,pthread_t在Linux上是int,但通常是其他系統中的結構,因此不能依賴原子性,需要額外的鎖定。 – jweyrich