线程之间需要共享公共资源,还要接收各自的堆栈。
1. 所有线程使用的公共资源必须同步,Win32 提供了几种同步资源的方式,包括信号、临界区、事件和互斥体。
互斥体(mutual exclusion 的缩写)是异步执行的线程或进程间通信的方式。此通信通常用于协调多个线程或进程的活动,通常通过锁定和取消锁定资源控制对共享资源的访问。假定有这样一个程序,一个线程更新静态数据结构,该结构包含要由其他线程显示的项的 x,y 坐标。为解决此 x,y 坐标的更新问题,更新线程将设置 mutex,在执行更新之前指示数据结构正在使用。更新线程将在两个坐标全部处理完之后清除互斥体。显示线程在更新显示之前必须等待清除互斥体。由于进程被阻止且直到清除 mutex 后才能继续,因此等待 mutex 的进程通常称为在 mutex 上“阻止”。也就是当一个线程在处理公共资源时设置一个互斥体,再结束处理后清除它。
需要小心管理的资源只有屏幕显示和静态数据两种。
//多线程的文件处理
HANDLE hIOMutex= CreateMutex (NULL, FALSE, NULL); //设置互斥体句柄
WaitForSingleObject( hIOMutex, INFINITE );//使用常数INFINITE,表示线程在互斥体上阻止,但不能等待超时
fseek( fp, desired_position, 0L );//文件指针重新设置
fwrite( data, sizeof( data ), 1, fp );
ReleaseMutex( hIOMutex);//释放互斥体把资源让给其他线程使用
2. 程序各自的堆栈
应用程序的所有默认堆栈空间都被分配到称为线程 1 的第一个执行线程。因此,必须为程序所需的每个附加线程的单独堆栈指定分配的内存量。如果必要,操作系统将为线程分配附加的堆栈空间,但必须指定默认值。
例子(from msdn):Bounce.c 是一个示例多线程程序,每次键入字母 a 或 A