Winapi 条件变量备选方案(windows xp上的c/c+;+;)

Winapi 条件变量备选方案(windows xp上的c/c+;+;),winapi,synchronization,Winapi,Synchronization,我想写一个线程,它从一个无限大小的任务容器中运行任务 任务列表为空时,应阻止尝试获取任务的线程 来自Linux,我想使用条件变量,它将在添加任务时发出信号,并在列表为空时等待 我发现CONDITION_变量仅在windows Vista中可用,因此这是毫无疑问的。 由于无限大小的限制,信号量也有问题 有合适的替代品吗 感谢WaitForSingleObject和CreateSemaphore?为什么说信号量有问题?Linux/Windows都有最大计数的信号量,可以用“无限”来描述 在Windo

我想写一个线程,它从一个无限大小的任务容器中运行任务

任务列表为空时,应阻止尝试获取任务的线程

来自Linux,我想使用条件变量,它将在添加任务时发出信号,并在列表为空时等待

我发现CONDITION_变量仅在windows Vista中可用,因此这是毫无疑问的。 由于无限大小的限制,信号量也有问题

有合适的替代品吗


感谢WaitForSingleObject和CreateSemaphore?

为什么说信号量有问题?Linux/Windows都有最大计数的信号量,可以用“无限”来描述

在Windows上使用James的建议-它可以正常工作。初始化。你的信号量为零计数。将任务添加到大(线程安全)容器中,然后向信号量发送信号。在线程中,等待信号量,然后从容器中获取任务并对其进行处理。如果愿意,您可以将信号量实例传递给多个线程——这也可以

Rgds,
Martin

听起来您想要一个Win32内核事件。请参阅。

谢谢大家, 这就是我的结论:

void ThreadPool::ThreadStartPoint(ThreadPool* tp)
{
    while (1)
    {    
        WaitForSingleObject(tp->m_taskCountSemaphore,INFINITE); // while (num of tasks==0) block; decreament num of tasks

        BaseTask* current_task = 0;

        // get top priority task
        EnterCriticalSection (&tp->m_mutex);
        {   
            current_task = tp->m_tasksQue.top();
            tp->m_tasksQue.pop();
        }
        LeaveCriticalSection (&tp->m_mutex);

        current_task->operator()(); // this is not critical section
        current_task->PostExec();
    }
}

void ThreadPool::AddTask(BaseTask& _task)
{
    EnterCriticalSection (&m_mutex);
    {
        m_tasksQue.push(&_task);
        _task.PrepareTask(m_mutex);
    }
    LeaveCriticalSection (&m_mutex);

    if (!ReleaseSemaphore(m_taskCountSemaphore,
                          1,    // increament num of tasks by 1
                          NULL  // don't store previuos num of tasks value
                          )) 
    {//if failed
        throw ("semaphore release failed");
    }
}

或者,如果你有多个合作伙伴,请查看WaitFormMultipleObjectSex。我理解,要使用WaitFormMultipleObjectSex,我必须处于警报状态,但我喝了太多啤酒:(@JohnZwinck-hehe…你故意更改了大小写…不是吗?你不需要对信号量进行无限计数就可以做到这一点,你只需要通知队列是否为空,以及一个互斥/关键部分来保护数据结构。也许与linux不同,Windows不支持无限大小的容器。它也不支持我有一个足够大的数据类型,可以计算无限数量的项目。你必须满足于更实用的东西。我想这是最好的解决方案,尽管我想要真正的无模仿,而不仅仅是“真实的”第一。使用这个解决方案,我不得不稍微改变一下设计,以防止有风险的嵌套锁。使用条件变量,我可以避免…“真正的无模仿”是不现实的。我无法想象任何系统,32位、64位或1024位,其中信号量最大计数可能会小于集合中的任务数。在32 bi上t、 例如,您看到的是4.2千兆任务。