实在不明白了,老说这个raii有问题

liuzu2016 2012-07-11 10:01:05


那里有问题啊


class CMyMutex
{

HANDLE hMutex;

public:

CMyMutex()
{
hMutex=::CreateMutex(NULL,true,NULL); //第二个参数,创建线程拥有互斥体
};

~CMyMutex()
{
::ReleaseMutex(hMutex);
::CloseHandle(hMutex);
}


unsigned int MyThread1(void* )
{


//other code


CMyMutex mutex;

/*
dosomehing
*/


return 0;
}




unsigned int MyThread2(void* )
{


//other code


CMyMutex mutex;

/*
dosomehing
*/


return 0;
}





...全文
157 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
pathuang68 2012-07-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

一个总体感觉就是:CMyMutex mutex;不应该在线程中而应该在线程外部创建,不同的线程用mutex这个对象来进行同步,如果在线程内创建,从通常的意义上来讲,就失去了mutex的意义。


这一句话,我第二次听到了,但是依然不懂, 所谓自动解锁,是靠着局部对象离开作用域,析构函数

里解锁。

如果用全局, 不得了了。

怎么解锁啊。

你能提供给一个全局的demo嘛……
[/Quote]

1. 在不同的线程中创建mutex,根本起不到线程同步的作用,因此没有意义
2. 如果一个线程获取了互斥体,则要获取该互斥体的第二个线程将被挂起,直到第一个线程释放该互斥体。正式用这种方式来进行同步的。

具体的用法,建议楼主查看MSDN,里面已经说得很清楚了。
liuzu2016 2012-07-11
  • 打赏
  • 举报
回复
一个总体感觉就是:CMyMutex mutex;不应该在线程中而应该在线程外部创建,不同的线程用mutex这个对象来进行同步,如果在线程内创建,从通常的意义上来讲,就失去了mutex的意义。


这一句话,我第二次听到了,但是依然不懂, 所谓自动解锁,是靠着局部对象离开作用域,析构函数

里解锁。

如果用全局, 不得了了。

怎么解锁啊。

你能提供给一个全局的demo嘛,

已经是第二个人告诉我用全局。可是全局怎么解锁啊。






[Quote=引用 4 楼 的回复:]
如果CMyMutex的析构函数正常得到了调用,还出现这个问题的话,那么就说明该析构函数写得有问题。

实验建议:

C/C++ code


int main(int argc, char** argv)
{
{
CMyMutex mutex;
}
cout << "============" << endl;
return 0;
}……
[/Quote]
pathuang68 2012-07-11
  • 打赏
  • 举报
回复
如果CMyMutex的析构函数正常得到了调用,还出现这个问题的话,那么就说明该析构函数写得有问题。

实验建议:

int main(int argc, char** argv)
{
{
CMyMutex mutex;
}
cout << "============" << endl;
return 0;
}


1. 先不要用线程,直接用上面的代码试试,看看在输出"============"之前,CMyMutex的析构函数是否会调用(应该会)
2. 然后检查析构函数,如果析构函数确认木有问题,那就要检查线程的代码了。


一个总体感觉就是:CMyMutex mutex;不应该在线程中而应该在线程外部创建,不同的线程用mutex这个对象来进行同步,如果在线程内创建,从通常的意义上来讲,就失去了mutex的意义。

当然,楼主的具体代码没有给出,我只是做常规的猜测,仅供参考。
liuzu2016 2012-07-11
  • 打赏
  • 举报
回复
我觉得没有额问题
南气子水 2012-07-11
  • 打赏
  • 举报
回复
先帮楼主UP。
没看懂
肥多罗 2012-07-11
  • 打赏
  • 举报
回复
提示什么问题
liuzu2016 2012-07-11
  • 打赏
  • 举报
回复
互斥体的用法,我会,

CreateMutex后,

在线程里等待,然后释放之。

之所以设计成raii,就是怕 忘了释放, 然后锁住。。。

你用了全局,是不是和raii 违背啊

我还是做个示范吧:

class CMyMutex
{
//用mfc的CMetux;
CMetux * p;
//构造、析构

public:
void lock()
{
p->lock();
}

void unlock()
{
p->unlock();
}

};

CMyMutex g_Mytex;



unsigned int MyThread(void*)
{

g_mytex.lock();
//要保护的代码

}

//过了线程,怎么解锁, 还是要手动解锁啊,否则锁死了。






[Quote=引用 6 楼 的回复:]
引用 5 楼 的回复:

一个总体感觉就是:CMyMutex mutex;不应该在线程中而应该在线程外部创建,不同的线程用mutex这个对象来进行同步,如果在线程内创建,从通常的意义上来讲,就失去了mutex的意义。


这一句话,我第二次听到了,但是依然不懂, 所谓自动解锁,是靠着局部对象离开作用域,析构函数

里解锁。

如果用全局, 不得了了。

怎么解锁啊。

你……
[/Quote]

69,322

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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