读书人

循环锁,该怎么解决

发布时间: 2012-04-07 17:31:51 作者: rapoo

循环锁
我写了个循环锁,但是为什么用的时候会有问题,不能进行互斥。。
class MutexEx
{
public:
/**-----------------*/
MutexEx(void);mFlag(0){}
~MutexEx(void){}
/**-----------------*/
//Enter loop-lock;
void enterLoop(void)
{ while(InterlockedExchange(&mFlag ,1))
boost::thread::yield();
}
//Leave loop-lock;
void leaveLoop(void)
{InterlockedExchange(&mFlag , 0);}
private:
long mFlag;
};

class MutexExImp
{
public:
MutexExImp(MutexEx& mutex) : mMutex(mutex)
{mMutex.enterLoop();}
~MutexExImp(void){mMutex.leaveLoop();}
protected:
MutexEx& mMutex;
};


[解决办法]
class MutexExImp
{
public:
MutexExImp(MutexEx& mutex) : mMutex(mutex)
{mMutex.enterLoop();}
~MutexExImp(void){mMutex.leaveLoop();}
protected:
MutexEx& mMutex;
};

你这个在构造函数中锁 在析构中解锁. 没法用啊
[解决办法]
那貌似就没问题啊
[解决办法]
刚用vc8写了一个简略的测试程序
-----------------------------------------------------
MutexEx g_mutex;

unsigned int WINAPI TestThread( void * pParam )
{
MutexExImp mutex( g_mutex );
int threadID = *(static_cast <int *> ( pParam ));
for (int i = 0; i < 10; i++ )
{
CString str;
str.Format( L "Thread ID :%d\r\n ", threadID );
OutputDebugString( str );
Sleep( 200 );
}
return 0;
}

void CTestSpinMutexDlg::OnBnClickedOk()
{
unsigned int threadID = 0;
static int id1 = 1;
CloseHandle( (HANDLE)_beginthreadex( NULL, 0, TestThread, &id1, 0, &threadID ) );
static int id2 = 2;
CloseHandle( (HANDLE)_beginthreadex( NULL, 0, TestThread, &id2, 0, &threadID ) );
}
-----------------------------------------------------

运行结果如下:
-----------------------------------------------------
Thread ID :1
Thread ID :1
Thread ID :1
Thread ID :1
Thread ID :1
Thread ID :1
Thread ID :1
Thread ID :1
Thread ID :1
Thread ID :1
Thread ID :2
线程 'Win32 线程 ' (0xa90) 已退出,返回值为 0 (0x0)。
Thread ID :2
Thread ID :2
Thread ID :2
Thread ID :2
Thread ID :2
Thread ID :2
Thread ID :2
Thread ID :2
Thread ID :2
线程 'Win32 线程 ' (0xec4) 已退出,返回值为 0 (0x0)。
-----------------------------------------------------
[解决办法]
把你调用的代码贴出来看看吧
顺便说一句,我测试的时候由于没有编译boost库,所以把boost::thread::yield()换成Sleep(0)的。


[解决办法]
void count(int id)
{
for (int i = 0; i < 10; ++i)
{ {
MutexExImp m(mutex);
//boost::mutex::scoped_lock
//lock(io_mutex);
std::cout < < id < < ": " < <
i < < std::endl;

}
Sleep(0);
}
}

读书人网 >C++

热点推荐