写点什么

多线程之信号量(By C++)

用户头像
赖猫
关注
发布于: 2020 年 12 月 25 日



信号量在多线程中,主要是用于线程的同步或者限制线程运行的数量。



所谓同步,当流程1运行在线程1中,流程2运行在线程2中,流程2必须在流程1结束之后才能开始执行。你会怎么做,所有就需要给出一个流程1结束的信号。



在信号来之前,让线程2先在某个位置等待,这个使用方式和互斥锁有点类似,互斥从某种意义上也是一种同步,只是互斥锁更倾向于保护共同资源。信号量大于0的时候就代表有信号,不需要等待,但不仅仅是1。



下面的这个例子设置了3个线程,设置最大同时只运行2个进程。





#include<Windows.h>

#include<iostream>

using namespace std;

//创建一个信号量

HANDLE hSemaphore;

//有参数

DWORD WINAPI MyThread2(LPVOID lpParamter)

{

while (1)

{

WaitForSingleObject(hSemaphore,INFINITE);

cout << "MyThread1 Runing :"<<"线程2" << endl;

Sleep(2000);

ReleaseSemaphore(hSemaphore,1,NULL);//释放信号量

}

}

//无参数

DWORD WINAPI MyThread1(LPVOID lpParamter)

{

while (1)

{

//信号量减1,如果等于0就进入睡眠,待大于0之后再减

WaitForSingleObject(hSemaphore,INFINITE);

cout << "MyThread2 Runing"<<"线程1" << endl;

Sleep(2000);

//信号量加1

ReleaseSemaphore(hSemaphore,1,NULL);//释放信号量

}

}

//无参数

DWORD WINAPI MyThread3(LPVOID lpParamter)

{

while (1)

{

//信号量减1,如果等于0就进入睡眠,待大于0之后再减

WaitForSingleObject(hSemaphore,INFINITE);

cout << "MyThread2 Runing"<<"线程3" << endl;

Sleep(2000);

//释放信号量,信号量加1

ReleaseSemaphore(hSemaphore,2,NULL);

}

}

int main()

{

//创建一个信号量,2是初值,3是最大值

hSemaphore =CreateSemaphore(NULL,2,3,NULL);

//第三个参数是线程函数的地址,第四个参数是传到线程的参数指针

HANDLE hThread = CreateThread(NULL, 0, MyThread1, NULL, 0, NULL);

//释放句柄

CloseHandle(hThread);

HANDLE hThread1 = CreateThread(NULL, 0, MyThread2, NULL, 0, NULL);

CloseHandle(hThread);

HANDLE hThread3 = CreateThread(NULL, 0, MyThread3, NULL, 0, NULL);

//释放句柄

CloseHandle(hThread3);

while(1);

return 0;

}

结果可以看到,三个线程交替运行2个





小编推荐自己的Linux、C/C++技术交流群:【960994558】整理了一些个人觉得比较好的学习书籍、视频资料共享在里面(包括C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等等.),有需要的可以自行添加哦!~



用户头像

赖猫

关注

还未添加个人签名 2020.11.28 加入

纸上得来终觉浅,绝知此事要躬行

评论

发布
暂无评论
多线程之信号量(By C++)