加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 04:56:12 所属栏目:百科 来源:网络整理
导读:我即将实现一个带有工作项排队的工作线程,当我在思考这个问题时,我想知道我是否做得最好. 有问题的线程必须有一些线程本地数据(在构造时初始化)并将循环工作项,直到满足某些条件. 伪代码: volatile bool run = true;int WorkerThread(param){ localclassins
我即将实现一个带有工作项排队的工作线程,当我在思考这个问题时,我想知道我是否做得最好.

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

伪代码:

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,但也许有更好的方法.

具有睡眠功能的部件看起来并不太好,因为睡眠值很大时会有很多额外的睡眠,或者睡眠值很小时需要额外锁定,这绝对没有必要.

但我想不出我可以使用的WaitForSingleObject友好原语而不是临界区,因为可能有两个线程同时排队工作项.因此,事件似乎是最佳候选者,如果已经设置了事件,则可以松开第二个工作项,并且它不能保证互斥.

也许甚至有一种更好的方法使用InterlockedExchange类型的函数可以减少序列化.

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

解决方法

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

一种选择是使用信号量进行等待.每次在队列上推送一个值时,都会发出信号通知信号,因此只有队列中没有项目时,工作线程才会阻塞.这仍然需要队列本身的单独同步.

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

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

另一种选择是使用condition variables.本机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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读