处理线程同步的一种方法
对线程同步做的一个抽象,线程的同步本质上都是依赖于某个其他事件的发生,用软件的方法来对所依赖的事件做一个抽象,将有助与程序编写的简捷
CreateEvent
Event的重要属性有一个是“自动”or“手动”,如果是自动的,则在某个线程用Wait××成功等待到事件的“通知”状态后,则事件状态立刻变成“未通知”状态,以保证同时对资源访问的线程只有一个。
原则上不算线程同步范畴,而属于对wait**的一种应用方式
一个可以作为定时器的内核对象,Waitable Timer
CreateWaitableTimer
SetWaitableTimer,
CancelWaitableTimer
共用资源
一组线程对一组同样性质的资源的争用,则这组资源需要有所表示,以告知线程们是否有空闲的给以为他们服务,以信号量机制实现
CreateSemaphore,ReleaseSemaphore
共用资源
一组线程对一个单一的资源的争用,需要有一种机制保证同一个事件只有一个线程能得到资源。以Mutex方式实现
CreateMutex
ReleaseMutex
与关键代码的差别在于:
1、 允许不同进程的线程之间同步
2、 内核对象,用户模式和内核模式切换的时候需要更多的CPU开销
特别说明:WaitForSingleObject/WaitForMultipleObject是抑制线程本身的一种手法,配合以共用资源对象或所依赖的其他对象“通知状态”的原子性变化,以达到线程在争用资源、互相依赖时执行的顺序化,从而达到同步的目的。
综上:其实Windows的线程同步机制是提供了一组不同情况下的资源争用处理办法而已。与此同时推出的Wait××却可以带来很多其他好处,甚至部分缓解C语言没有事件机制的缺憾,部分达到了JA,C#中事件机制的效果,为Oberserve模式的实现做了些贡献。
一般情况下多线程编程多采用MFC类库实现,那么如果不使用MFC 如何进行多线程程序设计呢?本文将就这个问题进行讨论:
微软在Windows API中提供了建立新的线程的函数CreateThread,它的语法如下:
hThread = CreateThread (&security_attributes, dwStackSize, ThreadProc,pParam, dwFlags, &idThread) ;
第一个参数是指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。在Windows NT中,它被设为NULL。第二个参数是用于新线程的初始堆栈大小,默认为0。在任何情况下,Windows根据需要动态延长堆栈的大小。
CreateThread的第三个参数是指向线程函数的指标。函数名称没有限制,但是必须以下列形式声明:
DWORD WINAPI ThreadProc (PVOID pParam) ;
CreateThread的第四个参数为传递给ThreadProc的参数。这样主线程和从属线程就可以共享数据。
CreateThread的第五个参数通常为0,但当建立的线程不马上执行时为旗标CREATE_SUSPENDED。线程将暂停直到呼叫ResumeThread来恢复线程的执行为止。第六个参数是一个指标,指向接受执行绪ID的变量。
大多数Windows程序写作者喜欢用在PROCESS.H表头文件中声明的C执行时期链接库函数_beginthread。它的语法如下:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-49702-4.html
不一样的感觉