我有两个信号量x
(最初为1)和y
(最初为0)。
我的线程功能代码有点像这样:
...
wait(x);
//setting some vars
signal(x);
wait(y);
...
我想确保线程在y
上等待,即。如果第一个帖子首先完成x
- 保护部分,它应该先在y
等待,&等等。在当前实现中,signal(x);
之后发生的上下文切换可以防止这种情况发生。
有没有办法做到这一点,还是我必须完全重组代码以防止这种可能性?
答案 0 :(得分:1)
不幸的是,信号量和所有其他POSIX锁定工具不允许设置优先级或类似工具来规范它们的获取顺序。 (这不是一个错误,而是一个功能.-)
完成所需任务的最简单方法是使用pthread_mutex_t
和相应的pthread_cond_t
保护状态变量。在状态变量中,您可以实现一个简单的时间戳来跟踪线程通过受保护部分的顺序。像
struct state {
pthread_mutex_t mutex;
pthread_cond_t cond;
size_t seen_at_x;
size_t seen_at_y;
};
答案 1 :(得分:0)
如果这对您很重要,那么您确实需要重新构建代码。
据我所知,当信号量被发出信号时,无法保证等待进程会按照他们开始等待的顺序被唤醒。
理想情况下,您的流程不应该关注它们到达同步点的顺序以及它们继续处理的顺序。
答案 2 :(得分:0)
我不知道这是否有效!它不允许取消线程synch / asynch但我不知道它是否适用于线程之间的上下文切换。试试看:
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL)
完成后的最后一行之后:
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL)