一个类被一个for循环创建了多个实例.并调用类中的函数,这个函数直接创建一个线程就返回了。
但线程中涉及到网络操作,所以得把代码段保护起来。如何让这多个实例共享一个CRITICAL_SECTION呢?比如这样的:class myCls()
{
public:
   VOID Start()
   {
      beginthread(thread, xxx);
   }   static int  thread(LPVOID lpVoid)
   {
         EnterCriticalSection(&cs);  //如果这里不加锁,会破坏数据包
         send(....);
         LeaveCriticalSection(&cs);
   }
}for (int i = 0; i < 10; i++)
{
    a = myCls();
    a.Start()
}

解决方案 »

  1.   

    把它定义为全局变量或者类的static变量。
      

  2.   


    不想破坏类的封装性,所以想把锁直接在类里初始化。
    如果把CRITICAL_SECTION g_CS定义在cpp之外, 应该在哪里调用InitializeCriticalSection来初始化它呢?
    如果定义成类的static变量的话,同样应该在哪里调用InitializeCriticalSection来初始化它呢?我目前是把它放构造 函数里的,但发现每次调用InitializeCriticalSection,都会产生一个新的CRITICAL_SECTION。。我描述的可能不太清楚,,基础太差了。
      

  3.   

    用一个引用计数器
    class CTest
    {
    public:
      static CRITICAL_SECTION g_CS;
      static int igCS_Count;public:
      CTest();
      virtual ~CTest();};CRITICAL_SECTION CTest::g_CS = {0};
    int CTest::igCS_Count = 0;CTest::CTest()
    {
      if(igCS_Count++ == 0)
      {
        InitializeCriticalSection(&g_CS);    
      }  
    }CTest::~CTest()
    {
      if(--igCS_Count == 0)
      {
        DeleteCriticalSection(&g_CS);
      }
    }
      

  4.   

    把类的CRITICAL_SECTION成员变量声明为Static
      

  5.   

    多谢各位按zgl7903的方法弄好了。