关于Windows线程同步的一个小问题,望高手能指点一二

图片说明
图片说明
为什么使用了临界区对象,那两个的值仍然不同?另外,能麻烦解释一下线程同步的具体概念吗?
PS:上面的代码由于我为了缩短长度进行了移动,结果出现了语法错误,原本
ThreadFunc的函数体是放在main后面的,执行时是没有语法错误的,请放心

1

3个回答

在Remain=False后面补上一句sleep(1000)再输出那两个的值,会发现结果是一样的,归根结底是计算机运行速度太快了(或者说是主线程与辅助线程的时间差)

0
 DWORD g_cnt1; 
DWORD g_cnt2; 
BOOL g_bContinue = TRUE; 
CRITICAL_SECTION cs; 

DWORD WINAPI ThreadProc(__in LPVOID lpParameter) 
{ 
  ::EnterCriticalSection(&cs); 
  while(g_bContinue) 
  { 
    g_cnt1++; 
    g_cnt2++; 
  } 
  ::LeaveCriticalSection(&cs); 
  return 0; 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
  HANDLE hThread[2]; 
  g_cnt1 = g_cnt2 = 0; 
  ::InitializeCriticalSection(&cs); 

  hThread[0] = ::CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL); 
  hThread[1] = ::CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL); 

  Sleep(1000); 
  g_bContinue = FALSE; 
  ::WaitForMultipleObjects(2, hThread, TRUE, INFINITE); 
  printf("g_cnt1=%d\n",g_cnt1); 
  printf("g_cnt2=%d\n",g_cnt2); 

  ::DeleteCriticalSection(&cs); 

  ::CloseHandle(hThread[0]); 
  ::CloseHandle(hThread[1]); 
  return 0; 
}

1
shen_wei
华夏文明,永续前进,进化不止,飞升无限! WaitForMultipleObjects,就是等待线程结束,比你使用Sleep更合理!!
2 年多之前 回复
world_pioneer
world_pioneer 并不是这样
2 年多之前 回复

线程没有结束,输出first和second的值的语句也用Enter和leave包起来,就OK了

0
world_pioneer
world_pioneer 并不是这样
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!