MFC线程(四):线程同步信号量(semaphore)

前面讲的三种保持线程同步的方法是临界区,事件,互斥.它们都有点类似,就是确保一次只有一个线程访问资源,独占一个资源.

而信号量就与它们不同,它是可以让很多线程同时访问一个资源,但是限制一次同时访问的数量.这样的资源一般是只读,所以不会造成资源的混乱.最简单的例子就是数据库中表的读操作,可以多个线程同时去读.而写可不行(只能一次让一个去写).

在这Server的编程中蛮有用,限制同时访问server的客户端是多少个.

 

Win32 API中的semphore

 

HANDLE hSemaphore;

CString szInfo = _T("I am useful info");

 

void MainTest(){

hSemaphore = CreateSemaphore(NULL,2,2,NULL);  //只能同时两个线程并发访问

AfxBeginThread(FunOne,NULL);

AfxBeginThread(FunTwo,NULL);

//如果再多加一个线程有可能出错,也可能不.假如恰好三个线程同时访问就出错,如果前面的某个已经访问完了那不会出错

}

 

UINT FunOne(LPVOID pParam){

WaitForSingleObject(hSemaphore, INFINITE);

CString info = szInfo;

ReleaseSemaphore(hSemaphore, 1, NULL);

}

 

UINT FunTwo(LPVOID pParam){

WaitForSingleObject(hSemaphore, INFINITE);

CString info = szInfo;

ReleaseSemaphore(hSemaphore, 1, NULL);

}

 

MFC中的semphore类

 

CSemaphore g_cSHE(2,2);

CString szInfo = _T("I am useful info");

 

void MainTest(){

AfxBeginThread(FunOne,NULL);

AfxBeginThread(FunTwo,NULL);

//如果再多加一个线程有可能出错,也可能不.假如恰好三个线程同时访问就出错,如果前面的某个已经访问完了那不会出错

}

 

UINT FunOne(LPVOID pParam){

g_cSHE.Lock();

CString info = szInfo;

g_cSHE.Unlock();

}

UINT FunTwo(LPVOID pParam){

g_cSHE.Lock();

CString info = szInfo;

g_cSHE.Unlock();

}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值