gpt4 book ai didi

c - sem_wait 没有按预期工作?

转载 作者:行者123 更新时间:2023-12-04 06:46:42 26 4
gpt4 key购买 nike

跟进我之前的问题:
Conditional wait with pthreads

我将代码更改为使用信号量而不是互斥锁和条件信号。但是,我似乎遇到了无法解释的情况。

这是摘要

function thread work {
while (true)
sem_wait(new_work)
if (condition to exit){
exit
}
while (work based condition){
if (condition to exit)
exit
do work
if (condition to exit){
exit
}
sem_post(work_done)
set condition to ready
}
exit
}

function start_thread(){
sem_wait(work_done)
setup thread work
create work
sem_post(new_work)
return to main()
}

function end_thread(){
set condition to exit
sem_post(new_work)
pthread_join(thread)
clean up
}

控制流程说明:
主线程调用start_thread创建线程,交出一些工作。 main 和 worker 并行继续。 main 可能在 worker 之前完成它的工作,反之亦然。如果 main 在 worker 之前完成了它的工作,那么 worker 就不再有效并且必须被告知中止它正在做的事情。这是“退出条件”。此函数 (start_thread) 不会在每次调用时创建线程,仅在第一次调用时创建。其余时间它更新为线程工作。

线程被重用并提供新的工作参数以减少创建和销毁线程的开销。一旦 main 决定不再需要工作线程,它就会调用 end_thread 函数。这个函数会告诉线程不再需要它,等待它退出,然后清理指针、信号量和工作结构。

线程在开始工作之前将始终等待信号量 (new_work)。我正在使用 sem new_work 来通知线程新的工作现在可用并且它应该开始。线程使用信号量 work_done 向控制函数 (start_thread) 发出信号,表明它已完成/中止工作。

除了在某些随机情况下,一切都很好。 end_thread 在 pthread_join 等待,线程在 sem_wait(new_work) 等待。

“退出条件”受互斥锁保护。

我似乎无法弄清楚是什么导致了这种情况。

这是跟踪的输出
 thread 1: sem NEW count, before wait : 0
thread 1: sem NEW count, before wait : 0
end post: sem NEW count, before post : 0
end post: sem NEW count, after post : 1
thread 1 exit.
thread exited, cleanup 1

Entered initialization for thread: 2

created a thread: 2
thread: 2 started.

.....


thread 2: sem NEW count, before wait : 0
thread 2: sem NEW count, before wait : 0
thread 2: sem NEW count, before wait : 0
end post: sem NEW count, before post : 0
thread 2 exit.
end post: sem NEW count, after post : 0
thread exited, cleanup 2

Entered initialization for thread: 3

created a thread: 3
thread: 3 started.

.....

thread 3: sem NEW count, before wait : 0
thread 3: sem NEW count, before wait : 0
end post: sem NEW count, before post : 0
end post: sem NEW count, after post : 1
thread 3: sem NEW count, before wait : 0

此时,线程在信号量处等待,exit_thread 在 pthread_join 处等待。

感谢您的时间。

最佳答案

sem_t 上的 POSIX 函数可被信号中断,因此它们会被您的进程/线程可能接收到的任何信号中断,特别是由于 IO。

  • 始终调查返回值
    系统调用(一般不仅用于sem_wait )
  • 特别放sem_wait在一个
    while 循环,检查错误
    健康)状况。如果错误条件是
    EINTR 重新运行 sem_wait .

  • 这同样适用于其他 sem_职能。查看它们的特定错误条件并专门处理它们。

    关于c - sem_wait 没有按预期工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3661872/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com