gpt4 book ai didi

c++ - 工作线程队列的最轻同步原语

转载 作者:可可西里 更新时间:2023-11-01 18:22:04 30 4
gpt4 key购买 nike

我即将实现一个带有工作项排队的工作线程,在思考这个问题的同时,我想知道我是否正在做最好的事情。

有问题的线程必须有一些线程本地数据(在构造时预先初始化)并且将循环处理工作项直到满足某些条件。

伪代码:

volatile bool run = true;

int WorkerThread(param)
{
localclassinstance c1 = new c1();
[other initialization]

while(true) {
[LOCK]
[unqueue work item]
[UNLOCK]
if([hasWorkItem]) {
[process data]
[PostMessage with pointer to data]
}
[Sleep]

if(!run)
break;
}

[uninitialize]
return 0;
}

我想我会通过关键部分进行锁定,因为队列将是 std::vector 或 std::queue,但也许有更好的方法。

Sleep 部分看起来不太好,因为 Sleep 值大时会有很多额外的 Sleep,或者当 Sleep 值小时会有很多额外的锁定,这绝对是不必要的。

但我想不出可以使用 WaitForSingleObject 友好原语来代替临界区,因为可能有两个线程同时对工作项进行排队。因此,如果 Event 已经设置,似乎是最佳候选者的 Event 可以松开第二个工作项,并且不能保证互斥。

也许还有一种更好的方法,使用 InterlockedExchange 类函数,可以减少序列化。

P.S.:我可能需要预处理整个队列并在取消排队阶段删除过时的工作项。

最佳答案

有很多方法可以做到这一点。

一种选择是使用信号量等待。每次将值插入队列时,信号量都会发出信号,因此工作线程只会在队列中没有项目时阻塞。这仍然需要对队列本身进行单独同步。

第二种选择是使用手动重置事件,该事件在队列中有项目时设置,并在队列为空时清除。同样,您需要对队列进行单独的同步。

第三种选择是在线程上创建一个不可见的仅消息窗口,并使用特殊的 WM_USERWM_APP 消息将项目发布到队列中,附加通过指针将项目指向消息。

另一种选择是使用 condition variables . native Windows 条件变量仅在您以 Windows Vista 或 Windows 7 为目标时才有效,但条件变量也可用于带有 Boost 的 Windows XP 或 C++0x 线程库的实现。我的博客上提供了一个使用 boost 条件变量的示例队列:http://www.justsoftwaresolutions.co.uk/threading/implementing-a-thread-safe-queue-using-condition-variables.html

关于c++ - 工作线程队列的最轻同步原语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3812405/

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