1、我有一个线程,它对一个队列里的数据进行处理。我想在队列没有数据时该线程等待,交出计算机资源的使用权,一有数据该线程就开始工作。我该用什么方式进行等待(我的线程函数的内处理队列的代码是放在一个while(TRUE)的死循环中的)?
2、一个程序中有两个以上的线程同时运行时,在这些线程运行过程中,当前正在使用cpu运行线程,可能会因为操作系统调配其他线程为当前使用cpu运行的线程,而终止使用cpu运行处于等待状态。 若一个程序中的所以这些线程的优先级相同,那每个线程中哪些语句或语句段是不会因线程的切换而在执行到一部分时被打断的?若一个程序中的各线程的优先级不同,那又会是什么情况? 

解决方案 »

  1.   

    WaitForMultipleObjects,加一个timeout,等待一个终止事件和一个数据到达事件
    终止事件是给主线程终止子线程用的,等到了就退出,没什么说的
    数据到达事件到达之后就处理数据,也没什么说的
    timeout之后继续wait……
    不想被打断的话,用临界区
      

  2.   

    1.线程可以在while(TRUE)中,周期性的检查队列,如果队列没有数据,那就Sleep(100);等让出CPU给其他线程处理,有了数据,这个线程就工作
    2.Sleep()就会让出CPU,线程会被打断...优先级不同,当一个线程让出CPU后,优先级高的线程容易抢得CPU
      

  3.   

    第一个问题容易, 多数人都是用WaitForMultipleObjects.第二个...具体问题具体分析
      

  4.   

    周期性的检查队列,如果队列没有数据,那就Sleep(100);等让出CPU给其他线程处理,有了数据,这个线程就工作 
      

  5.   

    1、当队列为空是等待一个事件,其它线程向队列插入数据后设置该事件。
    2、不知道你所说的“打断”是什么意思,如果当前处理器进行了线程切换,线程的运行自然被打断了。如果线程在访问某些数据时不想让其它线程访问这些数据,可以让所有线程访问这些数据时进入临界区,访问完后离开临界区。线程的优先级只决定线程获得CPU资源的几率,与此问题无关。
      

  6.   

    1.强大的1楼
    2.
    CRITICAL_SECTION CriticalSection; 
    InitializeCriticalSectionAndSpinCount(&CriticalSection, 0x80000400) ;
    EnterCriticalSection(&CriticalSection); 
    ////共用资源
    LeaveCriticalSection(&CriticalSection); 
    DeleteCriticalSection(&CriticalSection);
      

  7.   

    不好意思,我再菜问一下:
    用WaitForMultipleObjects,是将一个事件A拿给WaitForMultipleObjects等待吗? 若是,那是不是说在每次向队列中加入一个元素是就将事件A置为有效状态。当线程将队列中当前的数据处理完后就将事件A置为无效。那若在线程判断队列为空后,执行将事件A置为无效的语句前,系统出现线程切换,另一个线程B成为当前运行的线程。在线程B中,向队列中添加了一个元素,并将事件A置为有效。之后,系统再次切换,原线程继续工作——“执行将事件A置为无效的语句”。之后,由于事件A为无效,线程执行到WaitForMultipleObjects时认为队列为空,进行等待。而实际上此时队列并不为空。从而出现错误。这该怎么解决? 
      

  8.   

    CreateEvent的第2参数给FALSE,这样每次等待事件后会自动reset,线程用循环取队列中的数据并处理,如果队列为空再等待事件。
      

  9.   

    俺给你一个建议:采用线程同步技术加以解决:数据处理线程可用WaitForSingleObjetc等待事件,当等到事件后,ResetEvent,然后处理数据,如此循环;另一个线程往队列里放了数据后,SetEvent以便让数据处理线程处理数据,同时WaitForSingleObject等待另一个处理完的信号。
      

  10.   


    1.线程while循环中检测队列长度是否为0,若大于0则直接处理,否则的话加个Sleep(10)这样的调用来释放CPU。除非是实时性要求很高,否则的话这样处理是简单有效的。2.除了原子语句,是没有什么语句不会被cpu中断的。加上临界区也只是保证被当线程被切换后到在切换回来的这段时间,可以保证事务的完整性。优先级如上面大牛说的,只是影响被调度到的概率,但是也总是会被切换的。