WaitForSingleObject()函数的问题

时间:2022-03-25 18:50:34
WaitForSingleObject()函数的问题:
如果事件复位,系统是否还给WaitForSingleObject()所在的线程分配时间片?如果分配,那运行到WaitForSingleObject()处线程是释放时间片还是继续使用时间片等到时间片结束?
如果事件置位,WaitForSingleObject()所在线程是立即响应还是等到系统调度
分配给他时间片后从WaitForSingleObject()后开始执行?
例如事件原来是复位,我在同一个时间片内执行置位后立即复位,WaitForSingleObject()
还能返回吗?

9 个解决方案

#1


你的这个问题与操作系统关系较密切,我也不是很清楚。不过我想操作系统分配时间片应该是对当前处于运行态的进程来说的

#2


这个问题不太清楚,不过看你分倒不少,帮你抬一抬,呵呵……

#3


我的理解是調用WaitForSingleObject()后,該綫程不再分配時間片,但是系統會在它等待的事件置位后激活它。所以我覺得及是你將復位的事件置位再立即復位,WaitForSingleObject()還是會返回。我馬上去做一下試驗看看。

#4


測試代碼如下,結果如我說想。只是我不知道SetEvent和ResetEvent如何保證他們在一個時間片中完成。雖然我認爲這個時間片沒有關係,因爲系統監視的事件而非時間片,任何時候事件(内核變量)改變,系統都是及時知道的。如果置位后立即復位后就像事件沒有發生,那麽邏輯上會有講不通的地方。




HANDLE hEvent = NULL;

DWORD CALLBACK threadProc(LPVOID pParam)
{
  WaitForSingleObject(hEvent, INFINITE);
  TRACE("threadProc Exit!!!\n");
  return 0;
}

void CTestwaitDlg::OnButton1() 
{
  hEvent = CreateEvent(NULL, TRUE, FALSE, "testEvent");
  CreateThread(NULL, 0, threadProc, NULL, 0, NULL);
  Sleep(1000);
  SetEvent(hEvent);
  ResetEvent(hEvent);

}

#5


同意 gentlelion(Zero)
在wait时,系统不在给thread分配时间片,该线程处于阻塞状态
当event置位后,操作系统把线程放入待调度的队列,等待分配时间片运行

#6


gentlelion(Zero),如果你把你上面的程序的函数改为:
DWORD CALLBACK threadProc(LPVOID pParam)
{
  int i;
  i=0;
  while(i<10000)
  {
     i++;
     WaitForSingleObject(hEvent, INFINITE);
   }
   TRACE("threadProc Exit!!!\n");
   return 0;
}
void CTestwaitDlg::OnButton1() 
{
  hEvent = CreateEvent(NULL, TRUE, FALSE, "testEvent");
  CreateThread(NULL, 0, threadProc, NULL, 0, NULL);
  Sleep(1000);
  SetEvent(hEvent);
  ResetEvent(hEvent);

}
那么循环体中的waitforsingleobject()在循环几次后检测到事件复位而把线程阻塞。
waitforsingleobject()什么时候检测到事件复位?是下下个时间片吗?不好理解!

#7


waitforsingleobject不分配时间片.

#8


循环第一次就堵在那了 ResetEvent后又堵上了 再堵上的时候i循环到哪了倒是可以测测看
就是Set和Reset间的时差

#9


我想,所有的线成等待的是一个信号,而不是内核对象的状态本身,调用setevent,系统会做一个标记,然后会负责把这个信号发出去(即使这时event对象的状态已经变回去了)。

所以我认为,即使set和reset是在一个时间片内完成的,所有等待的线程仍然会接到通知。

#1


你的这个问题与操作系统关系较密切,我也不是很清楚。不过我想操作系统分配时间片应该是对当前处于运行态的进程来说的

#2


这个问题不太清楚,不过看你分倒不少,帮你抬一抬,呵呵……

#3


我的理解是調用WaitForSingleObject()后,該綫程不再分配時間片,但是系統會在它等待的事件置位后激活它。所以我覺得及是你將復位的事件置位再立即復位,WaitForSingleObject()還是會返回。我馬上去做一下試驗看看。

#4


測試代碼如下,結果如我說想。只是我不知道SetEvent和ResetEvent如何保證他們在一個時間片中完成。雖然我認爲這個時間片沒有關係,因爲系統監視的事件而非時間片,任何時候事件(内核變量)改變,系統都是及時知道的。如果置位后立即復位后就像事件沒有發生,那麽邏輯上會有講不通的地方。




HANDLE hEvent = NULL;

DWORD CALLBACK threadProc(LPVOID pParam)
{
  WaitForSingleObject(hEvent, INFINITE);
  TRACE("threadProc Exit!!!\n");
  return 0;
}

void CTestwaitDlg::OnButton1() 
{
  hEvent = CreateEvent(NULL, TRUE, FALSE, "testEvent");
  CreateThread(NULL, 0, threadProc, NULL, 0, NULL);
  Sleep(1000);
  SetEvent(hEvent);
  ResetEvent(hEvent);

}

#5


同意 gentlelion(Zero)
在wait时,系统不在给thread分配时间片,该线程处于阻塞状态
当event置位后,操作系统把线程放入待调度的队列,等待分配时间片运行

#6


gentlelion(Zero),如果你把你上面的程序的函数改为:
DWORD CALLBACK threadProc(LPVOID pParam)
{
  int i;
  i=0;
  while(i<10000)
  {
     i++;
     WaitForSingleObject(hEvent, INFINITE);
   }
   TRACE("threadProc Exit!!!\n");
   return 0;
}
void CTestwaitDlg::OnButton1() 
{
  hEvent = CreateEvent(NULL, TRUE, FALSE, "testEvent");
  CreateThread(NULL, 0, threadProc, NULL, 0, NULL);
  Sleep(1000);
  SetEvent(hEvent);
  ResetEvent(hEvent);

}
那么循环体中的waitforsingleobject()在循环几次后检测到事件复位而把线程阻塞。
waitforsingleobject()什么时候检测到事件复位?是下下个时间片吗?不好理解!

#7


waitforsingleobject不分配时间片.

#8


循环第一次就堵在那了 ResetEvent后又堵上了 再堵上的时候i循环到哪了倒是可以测测看
就是Set和Reset间的时差

#9


我想,所有的线成等待的是一个信号,而不是内核对象的状态本身,调用setevent,系统会做一个标记,然后会负责把这个信号发出去(即使这时event对象的状态已经变回去了)。

所以我认为,即使set和reset是在一个时间片内完成的,所有等待的线程仍然会接到通知。