刚才看Win32多线程程序设计时,他说线程退出的做法是在你的程序代码中设立一个标记,利用其值来要求线程结束自己。然后他建立了个事件,周期性地检查一个event对象。事件如果激活了就return。我想问为什么不用一个int变量来做标记呀?int变量变为1了线程就退出。这样可以吗??

解决方案 »

  1.   

    event可以阻塞,int一定要busy while,CPU负担加重,而且还要保证读取int的数据完整(加锁)
      

  2.   

     if(WaitForSingleObject(hRequestExitEvent, 0) != WAIT_TIMEOUT) 
            { 
                  printf("Received request to terminate\n"); 
                 return (DWORD)-1; 
            } 
    书上这样做也没有堵塞呀。而且我以为不需要堵塞,只不过是线程每次运行到那的时候检查一下,能退出就return了,不能退出就接着执行。
    例如 if(i == 1)
             return;
    不等于1就接着执行。
    至于“要保证读取int的数据完整”,我就是要在他退出的时候再别的线程里让 i = 1,就行了。就算切换时间片了的话下回运行的话也可以的吧。
      

  3.   

    应该不需要加锁吧,我在work线程里就是让他检验一下,
    if(i == 1)
       return;
    也不对i进行赋值什么的操作。只在主线程想让他退出的时候才对i进行i=1的操作;
      

  4.   

    if(WaitForSingleObject(hRequestExitEvent, 0) != WAIT_TIMEOUT) 
    这样就是在堵塞
      

  5.   

    如果dwMilliseconds 为0,对象没有被触发信号,函数不会进入一个等待状态,它总是立即返回。
    不是立即返回码?
    那就算他是阻塞了,我就像问问
    if(i==1)
       return;
    这样为什么不好呀!?
      

  6.   

    int赋值不是atom操作,操作的时候,CPU可以进行线程调度,虽然可能性不大。如果用_asm还可以说的过去。
    当然这也不是一成不变的,检查int在有些时候可能还更好。
      

  7.   

    自己逻辑控制好了,用int更好用.
      

  8.   

    回复于: 2012-12-04 10:06:10  
    event可以阻塞,int一定要busy while,CPU负担加重,而且还要保证读取int的数据完整(加锁)  
      

  9.   

    以前看Java的时候,曾看到在大规模并发的时候,利用CPU的一个什么特性(类似spinlock),用busy loop更加高效...
      

  10.   

    绝对可以,实时性要求不高时间,可以用的
    if(g_flag)
      return 0;
    else
     Sleep(10);