在主线程中分配new一块内存区,存有数据1、数据2、数据3.同时创建2个子线程访问该内存区,其中线程1需要访问数据1、数据2线程2需要访问数据1、数据3两个线程都是对数据进行读操作,不修改内存区的数据。当两个线程都完成了对内存区数据的访问,才释放delete内存区。问题1:
      因为仅仅是对内存区数据进行读操作。是不是可以不用线程同步?
问题2:
     内存区是在主线程中delete合理?还是在子线程中delete合理?
     如果是在主线程中delete,那么怎么判断两个子线程是否已经结束了对内存区的访问?难道还是线程同步方式??
     如果是在子线程中delete,那么怎么判断另一个子线程是否结束了对内存区的访问?     新手学习,不知道如何下手,请赐教:理顺一下思路!,谢谢!

解决方案 »

  1.   

    1. 都是读,就不需要同步了,都直接读好了
    2. 谁new的,谁负责delete比较好,
    3. 主线程跟子线程要同步,可以通过event等来通知
    4. 两个子线程之间要同步.
      

  2.   

    若都只是读,两个子线程间不用同步的了,对于删除当然是在主线程较好(个人观点),但估计你的主线程会要用到两个子线程的结果的,这就要同步了的,多个线程共享内存但两个子线程不执行写操作,所以在这里我觉得用CEvent比较好,只要保证与主线程间的同步就行,用临界区间也可以实现,
    若只是读觉得还是在主线程里delete好些,若在子线程中delete则要保证这二者这间也要同步了,还不排除你主线程要用到这块内存的情况
    看看WaitForMultilObject与临界区的用法
      

  3.   

    1. 一写多读不需要同步
    2. 谁new的,谁delete
    3. waitmultiobjects,子线程read之后 setevent,或者wait 子线程退出,在delete
    4. 子线程要同步,但是,一定要注意不要死锁
      

  4.   

    如果主线程有窗口,那么可以把窗口句柄传入子线程,当子线程退出的时候,给窗口发消息,然后主线程在消息响应里delete。这样就可以做到主线程new和delete
      

  5.   

    问题1:
      因为仅仅是对内存区数据进行读操作。是不是可以不用线程同步?
    读就不用同步了,只要不修改就没问题。问题2:
      内存区是在主线程中delete合理?还是在子线程中delete合理?
      如果是在主线程中delete,那么怎么判断两个子线程是否已经结束了对内存区的访问?难道还是线程同步方式??
      如果是在子线程中delete,那么怎么判断另一个子线程是否结束了对内存区的访问? 1楼的大牛也说了,谁new谁delete比较好,
    比如 char* pBuf = new char[20];
    不适用的时候delete[] pBuf,同时也将pBuf=NULL即可,这样你的线程要访问该变量的时候先判断一下pBuf是否为空,如果为空,肯定是被delete了。  
      

  6.   

    1. 谁new谁delete
    2. 释放的时候要判断 两个子线程都完成了工作,注意别死锁。看看能否设定子线程读完数据的标识,