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