临界区对象是多线程同步机制里面用得比较多的一个方法,与事件等同步机制不同,临界区对象是一个内存对象,而非事件一般的内核对象。在创建临界区对象的时候,采用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 );
}
测试的结果表示,如果我对临界区对象做了一次值拷贝,那么,将产生一个和原来的临界区对象同样状态的新对象,而对这个新对象的任何操作不会影响到原来的对象,于是问题出来了,这样的特点对于多线程同步来说可能造成甚么样的问题呢??
我首先想到的问题是,副本同步,也就是说传递了一个临界区对象的拷贝作为同步锁,这样的话,必然造成同步错误,但是这样的情况我好像一次都没有遇到过,是否还有其他可能的问题出现呢??
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 );
}
测试的结果表示,如果我对临界区对象做了一次值拷贝,那么,将产生一个和原来的临界区对象同样状态的新对象,而对这个新对象的任何操作不会影响到原来的对象,于是问题出来了,这样的特点对于多线程同步来说可能造成甚么样的问题呢??
我首先想到的问题是,副本同步,也就是说传递了一个临界区对象的拷贝作为同步锁,这样的话,必然造成同步错误,但是这样的情况我好像一次都没有遇到过,是否还有其他可能的问题出现呢??
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货