int ticket=100;
void main()
{
int a=0;
HANDLE hthread1=CreateThread(NULL,0,fun1Proc,NULL,0,NULL);
HANDLE hthread2=CreateThread(NULL,0,fun2Proc,NULL,0,NULL);
CloseHandle(hthread1);
CloseHandle(hthread2);
mutex=CreateMutex(NULL,FALSE,NULL);
Sleep(4000);}DWORD WINAPI fun1Proc(
LPVOID lpParameter // thread data
)
{
while(1)
{
WaitForSingleObject(mutex,INFINITE);
if(ticket>0)
{ Sleep(1);
cout<<"thread1 sell ticket:"<<ticket--<<endl; } else
break;
ReleaseMutex(mutex);
}
return 0;
}
DWORD WINAPI fun2Proc(
LPVOID lpParameter // thread data
)
{
while(1)
{
WaitForSingleObject(mutex,INFINITE);
if(ticket>0)
{
Sleep(1);
cout<<"thread2 sell ticket:"<<ticket--<<endl; } else
break;
ReleaseMutex(mutex);
}
return 0;
}
这是两个线程函数,如果这两个线程函数只是加上Sleep()使两个线程交替执行我明白.当实现互斥功能时
主线程沉睡后放弃对CPU的控制权 ,转入Fun1Proc();线程1得到互斥对象进入循环,沉睡,进入线程2,由于线程2得不到互斥对象
回到线程1,如果可输入条件成立执行COUT<<,而后ReleaseMutex(mutex);我想知道此时为什么进入线程2,去执行线程2了,线程1虽然刚执行完?
void main()
{
int a=0;
HANDLE hthread1=CreateThread(NULL,0,fun1Proc,NULL,0,NULL);
HANDLE hthread2=CreateThread(NULL,0,fun2Proc,NULL,0,NULL);
CloseHandle(hthread1);
CloseHandle(hthread2);
mutex=CreateMutex(NULL,FALSE,NULL);
Sleep(4000);}DWORD WINAPI fun1Proc(
LPVOID lpParameter // thread data
)
{
while(1)
{
WaitForSingleObject(mutex,INFINITE);
if(ticket>0)
{ Sleep(1);
cout<<"thread1 sell ticket:"<<ticket--<<endl; } else
break;
ReleaseMutex(mutex);
}
return 0;
}
DWORD WINAPI fun2Proc(
LPVOID lpParameter // thread data
)
{
while(1)
{
WaitForSingleObject(mutex,INFINITE);
if(ticket>0)
{
Sleep(1);
cout<<"thread2 sell ticket:"<<ticket--<<endl; } else
break;
ReleaseMutex(mutex);
}
return 0;
}
这是两个线程函数,如果这两个线程函数只是加上Sleep()使两个线程交替执行我明白.当实现互斥功能时
主线程沉睡后放弃对CPU的控制权 ,转入Fun1Proc();线程1得到互斥对象进入循环,沉睡,进入线程2,由于线程2得不到互斥对象
回到线程1,如果可输入条件成立执行COUT<<,而后ReleaseMutex(mutex);我想知道此时为什么进入线程2,去执行线程2了,线程1虽然刚执行完?
解决方案 »
- 代码有错吗?暂停键可以暂停一下,但是继续时就很快将时间片用完了
- 求助,帧差法
- 不显示删除回复显示所有回复显示星级回复显示得分回复 新手有关SNMP++的问题,会的来指点一下,谢谢
- 对话框在没有标题栏的情况下以最大化方式启动,谢谢!
- #if defined(__alpha) 该怎么满足这个条件
- VC 用什么API或类 可以对IIS进行访问 并对其属性进行配置啊 高手帮帮我啊
- 哪个ODBC API可以方便地获取表的列
- 串口的问题?
- vc调试中的小问题
- opengl//如何画出下面曲面?细分无数三角?
- 关于使用installshield2009打包的问题
- 如何得到COM的interface CLSID 和IID
如果我没猜错的话,你的代码应该是孙鑫老师的VC书里的,他讲得内容挺不错的
而是直接进入线程2了,线程1不也有WaitForSingleObject(mutex,INFINITE);
吗 难道这就好似所谓的“公平原则”?
当T1 ReleaseMutex(mutex)时,OS就处理与该mutex相关的一些东西.T2的WaitSingleObject就会返回,T2马上就进入就绪态.
T1迟了一步.然后切换到T2 看表演了
当T1 ReleaseMutex(mutex)时,OS就处理与该mutex相关的一些东西.T2的WaitSingleObject就会返回,T2马上就进入就绪态.
T1继续执行,但迟了一步.然后切换到T2
void main()
{
int a=0;
HANDLE hthread1=CreateThread(NULL,0,fun1Proc,NULL,0,NULL);
HANDLE hthread2=CreateThread(NULL,0,fun2Proc,NULL,0,NULL);
CloseHandle(hthread1);
CloseHandle(hthread2);
mutex=CreateMutex(NULL,FALSE,NULL);
Sleep(4000); }
感到很怪,有点不解,我帮你调整一下
void main()
{
int a=0;
mutex=CreateMutex(NULL,FALSE,NULL);
HANDLE hthread1=CreateThread(NULL,0,fun1Proc,NULL,0,NULL);
HANDLE hthread2=CreateThread(NULL,0,fun2Proc,NULL,0,NULL);
//等待一段时间
//释放
}