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

时间:2013-12-16 04:29:46

标签: c++ multithreading winapi

我为线程创建了以下内容

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”功能。在哪里以及如何实施。如果有人可以帮助我使用代码,那将是非常感激的。

1 个答案:

答案 0 :(得分: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
        }
    }
}