线程,事件,同步随笔

   今天突然有一同事问到waitforsingleobject 的用法,还有createthread(),下面随便写一下.纯粹是想到什么写什么,如果说写错了请指正.

 

    waitforsingleobject ()里面有两参数,一个是HANDLE,一个是时间,至于这个HANDLE可以是Thread,event等,记得在写键盘驱动的时候就用到这个,当时是要创建一个事件如:

HANDLE gWaitEvent = CreateEvent(NULL, FALSE, FALSE, NULL);这个就可以在下面用

DWORD ret=WaitForSingleObject(gWaitEvent,INFINITE );等待.其实这个的用法有很多种,还可以用SetEvent(HANDLE)来传信号量,看个人的习惯怎么用了.

 

   还有一个就是线程同步问题,其实同步也有几种方法,临界区,互斥,信号,事件......

下面就是一个用临界区实现线程同步的例子:

下面的是线程1运行完了,线程2运行,线程2运行线程3运行
#include "stdafx.h"
#include "stdio.h"
#include <windows.h>

CRITICAL_SECTION gs;
DWORD WINAPI helloFunc(LPVOID arg){
int i;
::EnterCriticalSection(&gs);//进入临界区
int *N =(int*)arg;
for(i = 0; i <18;i++)
{
printf("Thread %d run in %d/n",*N,i+1);
}

::LeaveCriticalSection(&gs);//退出临界区
ExitThread(0);
return 0;
}

int main(int argc, char* argv[])
{
::InitializeCriticalSection(&gs);//初始化临界区对象

HANDLE thread[3];
int x = 0,y = 1,z = 2;
thread[0] = CreateThread(NULL,0,helloFunc,&x,0,NULL);
thread[1] = CreateThread(NULL,0,helloFunc,&y,CREATE_SUSPENDED ,NULL);
thread[2] = CreateThread(NULL,0,helloFunc,&z,CREATE_SUSPENDED ,NULL);

::WaitForSingleObject(thread[0],INFINITE);

ResumeThread(thread[1]);

::WaitForSingleObject(thread[1],INFINITE);

ResumeThread(thread[2]);

::WaitForSingleObject(thread[2],INFINITE);
::CloseHandle(thread[0]);
::CloseHandle(thread[1]);
::CloseHandle(thread[2]);

return 0;
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值