循环锁

rick29 2007-09-21 03:52:08
我写了个循环锁,但是为什么用的时候会有问题,不能进行互斥。。
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;
};
...全文
561 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
wjlsmail 2007-09-22
  • 打赏
  • 举报
回复
mark
cunsh 2007-09-21
  • 打赏
  • 举报
回复
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);
}
}
rick29 2007-09-21
  • 打赏
  • 举报
回复
现贴一个很匪夷所思的代码:
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;
}
}

void main()
{
boost::thread thrd1(
boost::bind(&count, 1));
boost::thread thrd2(
boost::bind(&count, 2));
thrd1.join();
thrd2.join();
}
如果用我写的循环锁-输出:
1: 0
1: 1
1: 2
1: 3
1: 4
1: 5
1: 6
1: 7
2: 0
2: 1
2: 2
2: 3
2: 4
2: 5
2: 6
2: 7
2: 8
2: 9
1: 8
1: 9
如果用oost::mutex::scoped_lock lock(io_mutex)则输出:
1: 0
2: 0
1: 1
2: 1
1: 2
2: 2
1: 3
2: 3
1: 4
2: 4
1: 5
2: 5
1: 6
2: 6
1: 7
2: 7
1: 8
2: 8
1: 9
2: 9
输出应是按照boost的互斥,但是为什么用我的循环锁输出会是如此?
nkgd 2007-09-21
  • 打赏
  • 举报
回复
把你调用的代码贴出来看看吧
顺便说一句,我测试的时候由于没有编译boost库,所以把boost::thread::yield()换成Sleep(0)的。
rick29 2007-09-21
  • 打赏
  • 举报
回复
我检查了下,还是有问题,锁不住,用boost::mutex就不会有问题,晕晕。。。
nkgd 2007-09-21
  • 打赏
  • 举报
回复
刚用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)。
-----------------------------------------------------
rick29 2007-09-21
  • 打赏
  • 举报
回复
恩,我也是在查是不是我用的有问题。
我啃 2007-09-21
  • 打赏
  • 举报
回复
建议检查一下使用方的代码~
rick29 2007-09-21
  • 打赏
  • 举报
回复
恩,但是还是有问题,唉。。。
nkgd 2007-09-21
  • 打赏
  • 举报
回复
刚写了个程序测试你这个,应该是没问题的,可以实现互斥,还是使用方法的问题吧?
cunsh 2007-09-21
  • 打赏
  • 举报
回复
那貌似就没问题啊
cunsh 2007-09-21
  • 打赏
  • 举报
回复
rick29 2007-09-21
  • 打赏
  • 举报
回复
用的时候,比如:
MutexEx mutex;
void f()
{
MutexExImp mutexImp(mutex);
std:: cout << "ok" << std::ednl;
}
在定义的时候就加锁,在其生命周期结束的时候解锁。
cunsh 2007-09-21
  • 打赏
  • 举报
回复
这和 ACE_Guard 一样了
cunsh 2007-09-21
  • 打赏
  • 举报
回复
class MutexExImp
{
public:
MutexExImp(MutexEx& mutex) : mMutex(mutex)
{mMutex.enterLoop();}
~MutexExImp(void){mMutex.leaveLoop();}
protected:
MutexEx& mMutex;
};

你这个在构造函数中锁 在析构中解锁. 没法用啊
nkgd 2007-09-21
  • 打赏
  • 举报
回复
你这个应该是可以实现自旋互斥的,你使用的不对吧?
hoya5121 2007-09-21
  • 打赏
  • 举报
回复
CSDN的代码显示太不厚道了...
真是懒得去编辑
我啃 2007-09-21
  • 打赏
  • 举报
回复
mark一下以后看

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧