同步执行多个线程

【勇芳软件工作室】汉化HomePreviousNext

为了避免竞争条件和死锁,需要将多个线程的访问同步到共享资源。同步也是必要的,以确保以相应的顺序执行相互依赖的代码。

Win32 API提供了许多对象,其句柄可用于同步多个线程。这些对象包括:

*控制台输入缓冲区

*活动

*互斥

*进程

*信号灯

*线程

*计时器

这些对象的状态是用信号通知的或没有信号的。当在对等待功能之一的调用中指定任何这些对象的句柄时,调用线程的执行将被阻止,直到指定对象的状态变为信号。

其中一些对象在阻止线程直到某些事件发生时很有用。例如,当有未读输入(例如按键或鼠标按钮)时,会发出控制台输入缓冲区句柄。进程和线程句柄在进程或线程终止时发出信号。这允许一个进程,例如,创建一个子进程,然后阻止自己的执行,直到新进程终止。

其他对象在保护共享资源免受同时访问方面非常有用。例如,多个线程可以各自具有互斥体对象的句柄。在访问共享资源之前,线程必须调用其中一个等待功能来等待互斥体的状态信号。当互斥体发出信号时,只有一个等待的线程被释放以访问资源。互斥体的状态立即重新设置为不发出信号,因此任何其他等待线程仍然被阻止。当线程完成资源后,它必须将互斥体的状态设置为发信号,以允许其他线程访问资源。

对于单个进程的线程,关键部分对象提供比互斥体更有效的同步手段。使用一个关键部分,就像互斥体一次启用一个线程来使用受保护的资源。一个线程可以使用EnterCriticalSection函数来请求关键部分的所有权。如果它已经由另一个线程拥有,请求线程被阻止。一个线程可以使用TryEnterCriticalSection函数请求关键部分的所有权,而不会在失败获得关键部分时阻塞。线程获得所有权后,可以自由使用受保护的资源。执行该进程的其他线程不受影响,除非他们尝试进入相同的关键部分。

WaitForInputIdle函数使线程等待,直到指定的进程被初始化并等待用户输入,没有输入挂起。调用WaitForInputIdle对于同步父进程和子进程可能很有用,因为CreateProcess返回而不等待子进程完成其初始化。

有关详细信息,请参阅同步.