临界区对象是多线程同步机制里面用得比较多的一个方法,与事件等同步机制不同,临界区对象是一个内存对象,而非事件一般的内核对象。在创建临界区对象的时候,采用InitializeCriticalSection来生成。作为内存对象,是否表示如果我对临界区对象做值拷贝,那么相当于我产生了两个不同的临界区对象呢?我做了一个这样的测试:
CRITICAL_SECTION sec1 , sec2;
InitializeCriticalSection( &sec1 );
sec2 = sec1;
DeleteCriticalSection( &sec1 );
int i = 1 , j = 2;
CreateThread(NULL , 0 , Thread , &i , 0 , NULL );
CreateThread(NULL , 0 , Thread , &j , 0 , NULL );DWORD WINAPI Thread( void* p )
{
int i = *((int*)p);
do
{
EnterCriticalSection( &sec2 );
cout<<"thread " << i << endl;
LeaveCriticalSection( &sec2 );
Sleep( 1000 ); }
while( 1 );
}
测试的结果表示,如果我对临界区对象做了一次值拷贝,那么,将产生一个和原来的临界区对象同样状态的新对象,而对这个新对象的任何操作不会影响到原来的对象,于是问题出来了,这样的特点对于多线程同步来说可能造成甚么样的问题呢??
我首先想到的问题是,副本同步,也就是说传递了一个临界区对象的拷贝作为同步锁,这样的话,必然造成同步错误,但是这样的情况我好像一次都没有遇到过,是否还有其他可能的问题出现呢??

解决方案 »

  1.   

    你测试一下同时使用sec1和sec2会怎样。
      

  2.   

    同时使用sec1和sec2我测试过了,一样的,没有任何问题,我使用了4个线程来测试,其中,两个是用sec1同步,2个使用sec2同步,没有发生问题,如果说拷贝过来的数据在我们看不到的地方还有标志的话,那么这就是不可能的了,因为我是做的deadlock