【问题标题】: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 本身编写代码,让它做正确的事情”。
  • 条件为外部条件。当它们触发某些东西时,我正在将我的程序与外部软件连接起来,我必须运行这两个功能。此外,我必须不断检查外部软件是否已触发。我已经与两个外部方进行了交互。所以我创建了两个线程,以便它可以连续检查它们是否已触发。

标签: c++ multithreading winapi


【解决方案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
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    相关资源
    最近更新 更多