Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.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 在等待条件变量的多个线程中发送特定线程的信号_C_Linux_Condition Variable - Fatal编程技术网

C 在等待条件变量的多个线程中发送特定线程的信号

C 在等待条件变量的多个线程中发送特定线程的信号,c,linux,condition-variable,C,Linux,Condition Variable,这个问题源于。可能有很多线程在等待一个条件变量,我只需要给一个特定的线程发信号,比如说thread1,然后杀死它,因为它是死锁场景的参与者。有没有一种方法可以让我在这片土地上发一条不受欢迎的线 我非常感谢你的帮助 谢谢 编辑;尊重尼莫的评论。我知道这是个坏主意。但是,有没有办法做到这一点您可以使用延迟取消点。在线程中,使用pthread\u setcanceltype(pthread\u CANCEL\u DEFERRED,&oldstate)(这是默认设置,但明确无误);然后使用pthread

这个问题源于。可能有很多线程在等待一个条件变量,我只需要给一个特定的线程发信号,比如说thread1,然后杀死它,因为它是死锁场景的参与者。有没有一种方法可以让我在这片土地上发一条不受欢迎的线

我非常感谢你的帮助

谢谢


编辑;尊重尼莫的评论。我知道这是个坏主意。但是,有没有办法做到这一点

您可以使用延迟取消点。在线程中,使用
pthread\u setcanceltype(pthread\u CANCEL\u DEFERRED,&oldstate)(这是默认设置,但明确无误);然后使用
pthread_setcancelstate
禁用取消,但要取消的条件变量等待除外。确保使用
pthread\u cleanup\u push
设置取消清理处理程序;这对莱伊来说不太好

现在你可以取消你的线程了。取消清理处理程序按注册的相反顺序执行,调用TLS数据析构函数,线程退出(不从条件变量wait返回)


当然,这是一个相当丑陋的设计。理想情况下,你应该完全避免死锁;如果这是不可能的,如果是我,我会安排一次只在一个cvar上阻塞一个线程,并基于这些cvar构建一个更高级别(显式服务者列表)的构造,以便处理多个服务者,同时仍然允许线程单独寻址。

只需编写代码即可完成您需要的操作。没有快捷方式,因为条件变量不提供这种行为。那就写下来吧。这没有什么困难。例如,您可以设置一个特殊标志,唤醒条件变量上阻塞的所有线程,然后对线程进行编码以检查标志是否应该返回睡眠状态。

概率非常接近1,您的设计存在缺陷。您几乎肯定不想“检测死锁并杀死其中一个参与死锁的线程”。你想修复你的基本设计,这样死锁就不会发生…@Nemo。。。我同意你的看法。但是,在我们的特殊情况下,我们选择检测并解决死锁,而不是避免死锁,因为死锁发生的概率极为罕见。抱歉@Juggler,但我不相信这种理念。这是软件。世上没有“极其罕见”的东西。只有“永远”和“马车”。或者正如尤达所说,没有尝试。@Nemo…好吧,就这样吧。:-。Thanks@Nemo,那么,如果您正在编写一个数据库事务系统,其中事务的内容由更高级别的代码提供,那么中止事务并在死锁时重试可能是合理的(Berkeley DB会这样做,许多SQL实现也是如此)。所以我不会说这永远都不是一个合理的方法。这很少是一种合理的方法——特别是因为当你取消有问题的线程时,你必须有一个回滚计划。你能详细说明一下吗?在启用取消和等待条件变量之间是否存在基本的竞争条件?也就是说,您持有一个互斥锁,启用取消,然后尝试等待条件变量。。。但与此同时,有人认为你处于死锁,并在你持有互斥锁时对你进行核攻击?@Nemo,来自pthread_cond_wait主页:“条件等待(无论是否计时)是一个取消点。当线程的可取消性启用状态设置为PTHREAD_CANCEL_DEFERRED时,在条件等待时执行取消请求的一个副作用是在调用第一个取消清理处理程序之前(实际上)重新获取互斥锁。“因此,清理处理程序必须释放互斥锁。