我为线程创建了以下内容
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”功能。在哪里以及如何实施。如果有人可以帮助我使用代码,那将是非常感激的。
答案 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
}
}
}