一个类被一个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()
}
但线程中涉及到网络操作,所以得把代码段保护起来。如何让这多个实例共享一个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()
}
不想破坏类的封装性,所以想把锁直接在类里初始化。
如果把CRITICAL_SECTION g_CS定义在cpp之外, 应该在哪里调用InitializeCriticalSection来初始化它呢?
如果定义成类的static变量的话,同样应该在哪里调用InitializeCriticalSection来初始化它呢?我目前是把它放构造 函数里的,但发现每次调用InitializeCriticalSection,都会产生一个新的CRITICAL_SECTION。。我描述的可能不太清楚,,基础太差了。
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);
}
}