阅读本文须知:
主看代码——>不理解,看知识点or询问老师同学
知识点——os理论上信号量及pv操作 与 实际代码 的联系:https://www.cnblogs.com/staring-hxs/p/3665936.html
知识点——WaitForSingleObject
https://zhidao.baidu.com/question/237832055.html
<复杂>
https://blog.youkuaiyun.com/G453473123/article/details/105667931
https://wenku.baidu.com/view/79a4a1ff0242a8956bece495.html
/*
此程序主理解,明确:何时使用p,v,以及p,v对应 编程代码。
加强线程同步的理解。
实验目的:此实验目的是:锁住主线程,让dwThreadID1运行完后,再走主线程
实验进阶:看上 <复杂>
*/
#include <iostream>
#include <windows.h>
using namespace std;
static HANDLE hHandle1,hHandleS1= NULL;
DWORD dwThreadID1,dwThreadID2,dwThreadID3;//用于存储线程标识符的变量
void Threada();
void Threadc();
void Threadb();
int main()
{
//在哪个线程里用P操作,哪个线程就可能会挂起——看信号量
//由于实验要求 初始值设为0,同一时间内能够锁住Semaphore之线程的最多个数为1,此实验目的是:锁住主线程,让dwThreadID1运行完
CreateSemaphore(NULL,0,1,"SemaphoreName1");//创建一个名为SemaphoreName1,
hHandleS1= OpenSemaphore (SYNCHRONIZE|SEMAPHORE_MODIFY_STATE, NULL,"SemaphoreName1");
hHandle1 = CreateThread( (LPSECURITY_ATTRIBUTES) NULL,0,(LPTHREAD_START_ROUTINE) Threada,(LPVOID) NULL,0, &dwThreadID1 );
WaitForSingleObject( hHandleS1, INFINITE);//等待某个线程运行某某段时间,infinite表示让线程运行完,
CloseHandle(hHandle1);
CloseHandle(hHandleS1);
ExitThread(0);//撤销主线程
return 0;
}
void Threada()
{
//WaitForSingleObject( hHandleS1,INFINITE);
Sleep(500);
printf("I wake up");
ReleaseSemaphore(hHandleS1,1,NULL);//这行注释掉,这回不到主线程
}
/*
void Threadb()
{
printf("My name is WWZ \n");
}
void Threadc()
{
printf("Please wait…");
Sleep(5000);
printf("I wake up");
}
*/
两个线程不切换运行。则
1.用信号量(上代码)
2.让一个线程做infinite秒(下代码)
#include <iostream>
#include <windows.h>
using namespace std;
static HANDLE hHandle1,hHandleS1= NULL;
DWORD dwThreadID1,dwThreadID2,dwThreadID3;//用于存储线程标识符的变量
void Threada();
void Threadc();
void Threadb();
int main()
{
//句柄能否被继承,堆栈大小
//在哪个线程里用P操作,哪个线程就可能会挂起——看信号量
//由于实验要求 初始值设为0,同一时间内能够锁住Semaphore之线程的最多个数为1,此实验目的是:锁住主线程,让dwThreadID1运行完
CreateSemaphore(NULL,0,1,"SemaphoreName1");//创建一个名为SemaphoreName1,
hHandleS1= OpenSemaphore (SYNCHRONIZE|SEMAPHORE_MODIFY_STATE, NULL,"SemaphoreName1");
hHandle1 = CreateThread( (LPSECURITY_ATTRIBUTES) NULL,0,(LPTHREAD_START_ROUTINE) Threada,(LPVOID) NULL,0, &dwThreadID1 );
WaitForSingleObject( hHandle1, INFINITE);//等待某个线程运行某某段时间,infinite表示让线程运行完,
CloseHandle(hHandle1);
CloseHandle(hHandleS1);
ExitThread(0);//撤销主线程
return 0;
}
void Threada()
{
//WaitForSingleObject( hHandleS1,INFINITE);
Sleep(500);
printf("I wake up");
//ReleaseSemaphore(hHandleS1,1,NULL);//这行注释掉,这回不到主线程
}
void Threadb()
{
printf("My name is WWZ \n");
}
void Threadc()
{
printf("Please wait…");
Sleep(5000);
printf("I wake up");
}