实验二 线程同步

阅读本文须知:
主看代码——>不理解,看知识点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");

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值