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

winapi – 是否有一组Win32 API函数来管理同步队列?

发布时间:2020-12-13 20:35:32 所属栏目:Windows 来源:网络整理
导读:我有一个包含多个工作线程的程序,以及一个接收作业的主线程.在主线程中,我想将作业排队到同步队列,让工作线程在那里等待队列.当队列中有东西时,我希望工作人员从队列中取出作业,而剩下的工作则在那里等待另一份工作. 我找到了CreateMsgQueue(http://msdn.mic
我有一个包含多个工作线程的程序,以及一个接收作业的主线程.在主线程中,我想将作业排队到同步队列,让工作线程在那里等待队列.当队列中有东西时,我希望工作人员从队列中取出作业,而剩下的工作则在那里等待另一份工作.

我找到了CreateMsgQueue(http://msdn.microsoft.com/en-us/library/ms885180.aspx)但是这似乎仅适用于Windows CE.

我知道我可以自己写这个,但是如果已经存在某些东西我不会使用它是一个傻瓜.

我正在使用Visual Studio 2005在c中进行开发.

感激地收到任何建议.

谢谢
丰富

Windows无法准确提供您想要的内容.它提供的功能是 thread pools – 通过这些,您不仅可以自己创建队列,还可以创建或(直接)管理线程.

当然,同步队列也确实存在,而不是作为Windows的一部分.我写的一个看起来像这样:

#ifndef QUEUE_H_INCLUDED
#define QUEUE_H_INCLUDED

#include <windows.h>

template<class T,unsigned max = 256>
class queue { 
    HANDLE space_avail; // at least one slot empty
    HANDLE data_avail;  // at least one slot full
    CRITICAL_SECTION mutex; // protect buffer,in_pos,out_pos

    T buffer[max];
    long in_pos,out_pos;
public:
    queue() : in_pos(0),out_pos(0) { 
        space_avail = CreateSemaphore(NULL,max,NULL);
        data_avail = CreateSemaphore(NULL,NULL);
        InitializeCriticalSection(&mutex);
    }

    void push(T data) { 
        WaitForSingleObject(space_avail,INFINITE);       
        EnterCriticalSection(&mutex);
        buffer[in_pos] = data;
        in_pos = (in_pos + 1) % max;
        LeaveCriticalSection(&mutex);
        ReleaseSemaphore(data_avail,1,NULL);
    }

    T pop() { 
        WaitForSingleObject(data_avail,INFINITE);
        EnterCriticalSection(&mutex);
        T retval = buffer[out_pos];
        out_pos = (out_pos + 1) % max;
        LeaveCriticalSection(&mutex);
        ReleaseSemaphore(space_avail,NULL);
        return retval;
    }

    ~queue() { 
        DeleteCriticalSection(&mutex);
        CloseHandle(data_avail);
        CloseHandle(space_avail);
    }
};

#endif

(编辑:李大同)

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

    推荐文章
      热点阅读