我在开启多个线程的时候需要操作一全程链表,每个线程从此链表上取下一个元素然后链表头指针后移,该线程就操作此指针的结构进行,那么就需要早操作链表的时候进行互斥,以便其他线程不能进行链表操作,请问如何实现呢?
我曾经试过了用EnterCriticalSection,但是仍然不行,还是会出现丢掉元素的情况
我的操作如下:
 CRITICAL_SECTION myCriticalSection; ::InitializeCriticalSection(&myCriticalSection);
 这是在程序头进行的初始化以下为线程内:
 ::EnterCriticalSection(&myCriticalSection);
 中间为线程的链表操作
 ::LeaveCriticalSection(&myCriticalSection);
请问是这样的吗?为什么还是不行呢?还是有其他办法可以实现呢?

解决方案 »

  1.   

    多线程之间的同步,采用同步对象,如:mutex,event,semphore
    具体函数:
    DWORD WaitForSingleObject(
      HANDLE hHandle,        // handle to object
      DWORD dwMilliseconds   // time-out interval
    );DWORD WaitForMultipleObjects(
      DWORD nCount,             // number of handles in array
      CONST HANDLE *lpHandles,  // object-handle array
      BOOL fWaitAll,            // wait option
      DWORD dwMilliseconds      // time-out interval
    );
      

  2.   

    to flyelf:我全部都加上了的,还是不行!
    to mfc168:我开的是多个线程,WaitForMultipleObjects我是用于最后线程退出的,那如果我要使用互斥,是采用那个呢?具体如何实现呢?帮忙说清楚一点嘛!
      

  3.   

    我一时也解释不清楚很多,这里有实现同步,并使用不同的同步对象的源程序,你可以下来看一下,对你肯定会有帮助的:http://www.vckbase.com/code/listcode.asp?mclsid=13&sclsid=1305
      

  4.   

    利用互斥对象就可以了,首先创建互斥对象
    HANDLE m_hmtx = CreateMutex(PSECURITY_ATTRIBUTES psa,
                                BOOL fInitialOwner,
                                PCTSTR pszName)
    然后利用WaitForSingleObject,
    在操作完链表之后,不要忘记调用ReleaseMutex(m_hmtx)就可以了
      

  5.   

    同意楼上的意见!
    如果你加上了CriticalSection应该不会出现这个问题,
    问题应该出现在别的地方,好好查找一下吧!
      

  6.   

    所有访问到共享资源的地方都应该进行临界区控制,用CRITICAL_SECTION没有什么问题。