vc中有关线程同步的一个小问题

来源:百度知道 编辑:UC知道 时间:2024/06/14 08:59:33
比如说两个线程用互斥对象同步,当线程一请求到mutex,执行完要保护的代码,然后释放mutex,此时如果线程二正处于等待mutex的状态,是不是立刻就会运行线程二,而不管线程一的时间片有没有结束(当然是单处理器环境下)?还是说此时线程二只是获得了mutex,而继续执行的仍是线程一?对事件对象是不是也如此?
int tickets=100;
HANDLE g_hEvent;

void main()
{
HANDLE hThread1;
HANDLE hThread2;
hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);

你可能对线程状态和互斥对象2者之间的关系有点混乱.

WaitForSingleObject(hMutex, INFINITE);

如果你在一个线程调用这个函数, 这个线程将处理等待状态, 如果这个函数一旦返回, 那么这个线程肯定处于运行态, 而这个函数的返回结果可能是WAIT_ABANDONED,也可能是WAIT_OBJECT_0;

在线程一释放Mutex对象之前,系统会把线程二挂起来,直到Mutex被释放.一旦获得Mutex对象,线程二就会执行,而线程一如果执行到了它的启动函数的结尾时,就会被系统自动终止,否则线程一还是能继续执行.

而对于Event对象,线程是使用等待单个对象或者多个对象函数来判断一个或多个Event对象的当前状态,只有在有信号状态(一个或者多个),线程才会得到执行,否则就被挂起,所以Event对象应用范围比较广.

对于你说的两个线程的情况下,这两个同步对象区别并不是很大.