Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C pthreads,我如何知道进程中的另一个线程没有等待?_C_Linux_Pthreads - Fatal编程技术网

C pthreads,我如何知道进程中的另一个线程没有等待?

C pthreads,我如何知道进程中的另一个线程没有等待?,c,linux,pthreads,C,Linux,Pthreads,操作系统是Linux,使用pthreads 我有两个永久运行的工作线程,直到stop变量的值为true,线程正常终止。两个线程都调用pthread_cond_wait,直到有信号通知新任务,而不是忙于等待。该系统运行良好 它被要求创建一个“info”线程来打印一些调试信息。信息线程将尝试每30秒读取和打印一次信息。作为此信息的一部分,我希望是每个工作线程的状态。是否可以在“pthread\u cond\u wait”中查找线程是否被阻塞?如果线程等待为pthread_cond_wait,则状态=

操作系统是Linux,使用pthreads

我有两个永久运行的工作线程,直到stop变量的值为true,线程正常终止。两个线程都调用pthread_cond_wait,直到有信号通知新任务,而不是忙于等待。该系统运行良好

它被要求创建一个“info”线程来打印一些调试信息。信息线程将尝试每30秒读取和打印一次信息。作为此信息的一部分,我希望是每个工作线程的状态。是否可以在“pthread\u cond\u wait”中查找线程是否被阻塞?如果线程等待为pthread_cond_wait,则状态==等待,否则状态==正在运行

 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 pthread_cond_wait@@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

假设您正在使用一个在通知条件时被锁定的互斥锁,如果是这样,在您的信息线程中,只需尝试锁定该互斥锁-如果您获得它,那么很可能在您采样时,线程正在等待,否则如果它将阻塞,那么您知道线程正在做它的事情(也就是说,它已经获取了互斥体,这意味着它在它的关键部分)

您可以使用
pthread_self()
的返回作为互斥体所有权的标识符。存储并比较。由于互斥体可以由单个线程一次获取,因此您将知道哪个线程正在运行(而不是等待)您可以在互斥对象中注册共享结构s,其中每个线程借助
pthread\u self()
注册其状态(正在运行,未运行)

在检查条件变量之前,可以设置
s[pthread_self()]->state=WAITING
,检查之后可以设置
s[pthread_self()]->state=WORKING


确保设计结构时不会出现争用情况。

我会选择简单的方法,只在每个线程中包含一个状态枚举。在每次概念状态更改之前,您都会更改状态

void worker(void* parm)
{
    threadstate_t *state = (threadstate_t*)parm;

    /* ... */
    while (...) {
         state->current = STATE_WORKING;

         /* ... */

         state->current = STATE_WAITING;
         /* res = pthread_cond_wait(cond, mutex); */
    }
}
然后在您的对话线程中:

void worker_dbg(void* parm)
{
    threadstate_t *states = (threadstate_t*)parm;
    int i;

    while (run) {
        for (i = 0; i < NWORKERS; ++i) {
            /* _state is a map of states to strings */
            printf("Thread %d: %s\n", states[i].id, _state[states[i].current]);
        }
        sleep(30);
    }
}
void worker\u dbg(void*parm)
{
threadstate_t*状态=(threadstate_t*)参数;
int i;
while(运行){
对于(i=0;i

如果由于状态在打印后立即更新而关闭30秒,这并不重要。不需要锁定状态,因为您只从拥有的工作线程写入,而只从调试线程读取。

Nim的答案是好的。相反,对互斥体使用trylock意味着成功后另一个线程将休眠g、 解决方案的问题是互斥锁可能由两个工作线程共享threads@akappa,为什么?这是一个trylock尝试,如果失败,很好,线程正忙,如果成功,您立即释放它,但您知道线程在该时间点处于睡眠状态。缺点是什么?在后一种情况下,您在线程上有一个额外的锁定/解锁另一个线程被迫等待的互斥锁-除非这是某个实时关键应用程序,否则我不认为这是一个问题!?!你说的是:“除非这是某个实时关键应用程序”:)如果工作人员锁定某个互斥锁(即在共享互斥锁的情况下),则该互斥锁不起作用。为什么不?每个线程都有自己的id。保留一个可访问的
pthread\t current\u owner
,并在工作线程每次获取互斥时更新它。然后,您的info线程将此变量与每个工作线程的id进行比较。请记住,pthread_t在Linux上是一个
int
,但在其他系统中通常是一个结构,因此您不能依赖原子性,需要额外的锁。主要原理与我的类似,但您将状态附加到线程,而我在互斥体上执行,因此您的方法比我的方法更干净+1只需将每个互斥体添加到状态枚举中,您就可以采用您的方法并将其应用到我的方法中。你需要多少就有多少。