孙鑫的关键代码段问题

[复制链接]
查看11 | 回复10 | 2021-1-27 06:45:36 | 显示全部楼层 |阅读模式
RT。小弟小白,正在看孙鑫关键代码段的问题。
#include
#include
#include
#include"iostream"
usingnamespacestd;
inttickets=100;
CRITICAL_SECTIONg_cs1;

DWORDWINAPIs1(LPVOIDlpParameter)
{
while(TRUE)
{
EnterCriticalSection(&g_cs1);
Sleep(2);
if(tickets>0)
{
Sleep(2);
cout0)
{
Sleep(2);
cout
上述代码是照搬的代码,但是输出如下,thread2不会执行:


但是我稍微做个改变,在线程是s1、s2while循环的最后加一句cout验证线程是否执行,结果却是这样,线程2可以执行:
#include
#include
#include
#include"iostream"
usingnamespacestd;
inttickets=100;
CRITICAL_SECTIONg_cs1;

DWORDWINAPIs1(LPVOIDlpParameter)
{
while(TRUE)
{
EnterCriticalSection(&g_cs1);
Sleep(2);
if(tickets>0)
{
Sleep(2);
cout0)
{
Sleep(2);
cout

各位大神,这是什么情况?谢谢!
分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:45:36 | 显示全部楼层
你加的这句已经不在临界区了
回复

使用道具 举报

千问 | 2021-1-27 06:45:36 | 显示全部楼层
引用1楼paschen的回复:你加的这句已经不在临界区了
那为什么用上面的源码thread2是不执行的?我想要验证这个问题
回复

使用道具 举报

千问 | 2021-1-27 06:45:36 | 显示全部楼层
引用2楼tofumikelai的回复:Quote: 引用1楼paschen的回复:
你加的这句已经不在临界区了

那为什么用上面的源码thread2是不执行的?我想要验证这个问题

哪看出没执行了
回复

使用道具 举报

千问 | 2021-1-27 06:45:36 | 显示全部楼层
引用3楼paschen的回复:Quote: 引用2楼tofumikelai的回复:
Quote: 引用1楼paschen的回复:
你加的这句已经不在临界区了

那为什么用上面的源码thread2是不执行的?我想要验证这个问题

哪看出没执行了

thread2没有售票,都是thread1售票。
小弟小白一个,大神求教啊。。
另外我想问下if语句前后的两个sleep分别有什么作用,书上没有说,我不知道为什么要用两个。
回复

使用道具 举报

千问 | 2021-1-27 06:45:36 | 显示全部楼层
跑的太快了,没来得及换线程
LeaveCriticalSection后面加一句Sleep(0)
回复

使用道具 举报

千问 | 2021-1-27 06:45:36 | 显示全部楼层
引用4楼tofumikelai的回复:Quote: 引用3楼paschen的回复:
Quote: 引用2楼tofumikelai的回复:
Quote: 引用1楼paschen的回复:
你加的这句已经不在临界区了

那为什么用上面的源码thread2是不执行的?我想要验证这个问题

哪看出没执行了

thread2没有售票,都是thread1售票。
小弟小白一个,大神求教啊。。
另外我想问下if语句前后的两个sleep分别有什么作用,书上没有说,我不知道为什么要用两个。

时间太快,thread2还没进入临界区,thread1已经再次进入了,而你在后面加了一个输出后,thread2就在此时进入了临界区
另Sleep用来使线程放弃操作权n毫秒,n为后面的参数,现在计算机执行得特别快
回复

使用道具 举报

千问 | 2021-1-27 06:45:36 | 显示全部楼层
引用5楼jiht594的回复:跑的太快了,没来得及换线程
LeaveCriticalSection后面加一句Sleep(0)

啊,可以了!大神也!
我想问另外一个问题,孙鑫这源码里面if前后有两个sleep(1)到底什么意思?一个不就够了吗?
Sleep(2);
if(tickets>0)
{
Sleep(2);
回复

使用道具 举报

千问 | 2021-1-27 06:45:36 | 显示全部楼层
可以通过在LeaveCriticalSection(&g_cs1);后加Sleep(0);放弃让线程放弃控制权
否则可能存在他执行完本次出售后,线程还处于CPU分配的时间片段里,他又再次进入了临界区,这样thread2就又没得到进入机会
回复

使用道具 举报

千问 | 2021-1-27 06:45:36 | 显示全部楼层
引用7楼tofumikelai的回复:Quote: 引用5楼jiht594的回复:
跑的太快了,没来得及换线程
LeaveCriticalSection后面加一句Sleep(0)

啊,可以了!大神也!
我想问另外一个问题,孙鑫这源码里面if前后有两个sleep(1)到底什么意思?一个不就够了吗?
Sleep(2);
if(tickets>0)
{
Sleep(2);

一个也行,这只是一个人为设置的让他停一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行