一个结构指针正在被线程访问,由于某些情况产生错误需要删除结构指针。可是这时可能还有其他线程正在使用。这样就会造成其他正在使用该结构指针的线程访问这个结构指针出现非法操作!
如果只有一个结构指针,在每个线程开始使用结构指针时进行互斥可以防止这种情况。可是假如有很多个结构指针,再使用同样方法的互斥,就会造成只要是有一个线程使用任意一个结构指针,其它线程就不能同时访问其他没有被使用的结构指针。
请问有没有什么好的方法可以避免出现这种情况?

解决方案 »

  1.   

    对于所有的与该指针有关的操作,用互斥量保护;
    CRITICAL_SECTION
    InitializeCriticalSection
    DeleteCriticalSection
    EnterCriticalSection
    LeaveCriticalSection
      

  2.   

    你的那些指针是指向同一个结构体变量吗?
    如果是,你就必须对那个共享的结构体变量进行同步,对那些指向同一个结构体的变量同步好象没有什么意义,因为那些指针不是共享资源,他们只是指向共享资源而已!所以你只需要用Mutex,CriticalSection,Event等同步对象来控制访问的同步即可!希望对你有所帮助!
      

  3.   

    to topwork(日光) :
    我有很多个指针,采用多线程的目的就是可以同时使用不同的指针。如果在线程中互斥,那就会造成一个线程为使用某一个指针而进入互斥,而其他线程就只能等待互斥,无法实用其他的未使用的一个指针。to vcforever(霓裳羽衣):
    对!指向同一个结构体变量。由于有很多个线程都可能使用结构体变量,但我要delete这个结构体变量就会造成其他正在通过指针使用结构体变量的线程访问该结构体变量时非法操作。
      

  4.   

    可能是我说的不明白!我具体再说说!
    不知到大家熟悉不熟悉完成端口机制,在将一个文件对象和完成端口结合时可以带入一个参数completekey。这个completekey可以是一个指向某一个内存结构的指针。你需要建立一个线程对完成端口进行查询,当有任何输入和输出时就会查询到有io操作,这时带入的那个completekey会被带回。
    但这个completekey我可能保存在另外一个地方,共其他线程使用。如果一个线程将这个completekey删除了,这是有正好产生io操作,使查询完成端口的线程得到了这个completekey。如果在这个线程中访问completekey就会出现非法操作。
    如果只有一个completekey,我就可以在所有访问completekey的地方加上互斥。可是假如有很多个completekey,我再使用互斥就会造成所有线程都只要等待一个线程访问任意一个completekey,而不能访问其他没有被访问的completekey。
      

  5.   

    对每个completekey,用Mutex同步对它的访问