win32中线程的正确同步方法是啥

Posted

技术标签:

【中文标题】win32中线程的正确同步方法是啥【英文标题】:What is the correct synchronization method for the thread in win32win32中线程的正确同步方法是什么 【发布时间】:2013-12-16 04:29:46 【问题描述】:

我为线程创建了以下内容

int Data_Of_Thread_1 = 1;
int Data_Of_Thread_2 = 2;
Handle_Of_Thread_1 = 0;
Handle_Of_Thread_2 = 0;
HANDLE Array_Of_Thread_Handles[2];

Handle_Of_Thread_1 = CreateThread( NULL, 0,ModbusRead, &Data_Of_Thread_1, 0, NULL);  

Handle_Of_Thread_2 = CreateThread( NULL, 0,ModbusWrite, &Data_Of_Thread_2, 0, NULL);  

现在我必须控制这两个线程的执行。条件如下:

function ModbusWrite

 if (condition1 true)
   
     Pause thread1

     if(condition2 true)
           
               resume thread1
           
     
 

我浏览了这些网站。他们说同步元素是事件、互斥体、信号量。等我想我必须使用事件或互斥锁。但我不太清楚如何使用它们。首先,我们创建创建事件或创建互斥锁,然后如何在上述条件下应用这些事件或互斥锁。我也不清楚“WaitForSingleObject”功能。在哪里以及如何实施。如果有人可以帮助我编写代码,那将不胜感激。

【问题讨论】:

什么保护条件?是什么改变了他们?此外,从不考虑通过暂停或恢复线程来强制线程从外部做正确的事情。只需对其进行编码以首先做正确的事情本身。不要想“我如何控制 thread1 让它做正确的事情”,想想“我如何为 thread1 本身编写代码,让它做正确的事情”。 条件为外部条件。当它们触发某些东西时,我正在将我的程序与外部软件连接起来,我必须运行这两个功能。此外,我必须不断检查外部软件是否已触发。我已经与两个外部方进行了交互。所以我创建了两个线程,以便它可以连续检查它们是否已触发。 【参考方案1】:

在 Windows 上,通常使用event objects 来等待条件而不浪费 CPU。如果您正在与之交互的外部软件提供某种异步回调机制,那么您需要执行以下操作:

// Create an anonymous auto-reset event, initial state unsignaled
HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
...

void ThreadProcedure()

    while (threadShouldContinueRunning())
    
        // Wait until event is signaled
        WaitForSingleObject(hEvent, INFINITE);

        // Now the thread has woken up, check the condition and respond
        // accordingly
    

...

void OnExternalCallback()

    // Called from external library when the condition becomes true -- signal
    // the worker thread to resume
    SetEvent(hEvent);

...

// Don't forget to cleanup
CloseHandle(hEvent);

现在,如果外部库确实提供任何类型的回调机制来通知您何时条件变为真,那么您就有麻烦了。在这种情况下,检测条件何时变为真的唯一方法是不断轮询它,可选择在其间休眠以避免消耗 CPU 时间。当然,这样做的主要缺点是您在检测条件变化时引入了不必要的延迟(延迟量是睡眠时间),或者您浪费了大量的 CPU(因此浪费了电源/电池寿命)旋转。

void ThreadProcedure()

    while (threadShouldContinueRunning())
    
        // Avoid polling if at all possible -- this adds latency and/or wastes
        // CPU and power/battery life
        if (externalConditionIsTrue())
        
            // Handle
        
        else
        
            Sleep(50);  // Tune this number to balance latency vs. CPU load
        
    

【讨论】:

以上是关于win32中线程的正确同步方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

win32 相关同步api

win32 相关同步api

win32多线程设计总结

在 Node.js 中进行同步 MongoDB 查询的正确方法是啥?

这种同步方法的名称是啥?

从同步代码调用异步方法并阻塞直到任务完成的正确方法是啥? [复制]