gpt4 book ai didi

c - 在线程池实现中保留锁定顺序

转载 作者:太空宇宙 更新时间:2023-11-03 23:31:29 26 4
gpt4 key购买 nike

我有一个特定的锁定顺序。我正在编写一个线程池来执行一些当前按顺序完成的任务。

加锁顺序为pool->queue->job。

但是,有时我需要锁定作业以检查作业的状态,然后锁定队列以将作业从一个队列移动到另一个队列。所以,为了遵循锁定顺序,我得到了这个:

lock job

if (job->state == CANCELED) {
unlock job
lock queue
lock job
// check that it is still canceled and do work
}

我的问题是,是否有没有解锁/锁定作业的替代方法?当必须保留锁定顺序并且需要“更高”的锁定时,如何处理?

最佳答案

我认为您可以对队列进行尝试锁定。如果成功,您将拥有两个锁并可以继续。如果失败,其他人已经拥有队列锁,并且因为您不知道他是否正在等待您的作业锁,所以您必须先对作业进行解锁,然后才能对队列进行阻塞锁定,否则您可能会死锁。

我认为下面的代码永远不会死锁:

lock(job);
if (job->state == CANCELED) {
if (!tryLock(queue)) {
// Cannot lock queue; must avoid dead lock
unlock(job);
lock(queue); // This one might block now
lock(job);
}
if (job->state == CANCELED) {
// Do work
}
unlock(queue);
}
unlock(job);

您可能会以不同的锁定顺序解锁队列和作业,这取决于 try-lock 是否成功(如果成功则顺序正确,否则错误),但我仍然认为它永远不会死锁。

关于c - 在线程池实现中保留锁定顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14323756/

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