首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pthreads等待并发出信号表示怀疑linux

pthreads等待并发出信号表示怀疑linux
EN

Stack Overflow用户
提问于 2012-07-27 14:30:23
回答 1查看 2.9K关注 0票数 1

在pthread等待之前,我们使用互斥锁,这样其他代码就不会尝试更改条件变量。等待,然后解锁互斥锁并等待信号。

比方说,在其他线程中,我锁定了相同的互斥锁,在那之后,我使用了“signal”。然后解锁线程。当信号完成时,等待的线程唤醒并再次获取互斥锁。

代码语言:javascript
复制
Thread1                   Thread2
{                         {
    lock(mutex);               lock(mutex);
    wait(mutex);               signal(mutex);
    unlock(mutex);             unlock(mutex);
}                          }

假设三个线程一语句被封装在一个while(1)循环中。然后假设thread2锁定互斥锁,给它发信号,然后解锁互斥锁。然后并没有结束,而是进入了睡眠状态。

那么条件变量的值会永久改变吗?如果线程1的三个语句在无限lop中运行,它是否永远不会等待,只会发现信号已经给出?当等待调用返回时,是否将条件变量的值设置回初始值?

如果是,我是否可以在变量上使用create、destroy或initialize方法来重新设置值?如果是,是如何实现的?这些函数到底是做什么的?

谢谢,

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-30 13:52:17

pthread_cond_wait()中,pthread_cond_signal()将始终唤醒至少一个当前正在等待该条件变量的线程。如果相同的线程或不同的线程再次调用pthread_cond_wait(),它将阻塞并等待另一个信号。

这意味着pthread条件变量必须始终与某种类型的共享数据配对,并受调用pthread_cond_wait()时持有的互斥保护。在调用pthread_cond_wait()之前,线程必须检查共享数据,看看它想要等待的条件是否已经发生-如果没有,就不应该等待。

这种共享数据的最简单示例可能是全局标志。在您的示例中:

代码语言:javascript
复制
int flag = 0;

Thread 1 {
    pthread_mutex_lock(&mutex);
    while (!flag)
        pthread_cond_wait(&cond, &mutex);
    pthread_mutex_unlock(&mutex);
}

Thread 2 {
    pthread_mutex_lock(&mutex);
    flag = 1;
    pthread_mutex_signal(&cond);
    pthread_mutex_unlock(&mutex);
}

您可以在这里看到,当条件为"reset“时,完全由您控制-例如,您可以在Thread 1调用pthread_mutex_unlock()之前将其设置为flag = 0;

共享状态通常比简单的标志更复杂-例如,当共享缓冲区中没有空间时,您可能有一个生产者线程调用pthread_mutex_wait()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11682588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档