锁到底有什么用处?

aspvbjava 2005-02-21 01:42:05
我下面的程序,大意是两个线程同时修改同一个对象的成员,没有使用锁,也没有出现错误阿

锁的作用不是防止多个线程同时访问同一个成员出错设置的么?为什么这里不需要?

class test
{
public:
test() : value(0)
{}
~test(){}
int value;
};

class MyThread
{
public:
int ThreadProc(void *param){
test *ptt = (test*)param;
while(1)
{
ptt->value = 100;
}

return 0;
}
};


int main()
{
test *pt = new test;

MyThread *thd = new MyThread;
thd->Run(pt);

MyThread *thd2 = new MyThread;
thd2->Run(pt);

while(1){
Sleep(1000);
}


return 0;
}
...全文
99 点赞 收藏 11
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
sinall 2005-02-21
我想你所说的是程序崩溃吧,那应该是不可能的。
“出错”指的是可能引起变量的值错误。
回复
sumjohn 2005-02-21
我知道逻辑已经乱了,但我想知道为什么不出错,两个线程同时访问同一个对象的成员不出错么?

或者谁有简单的没有锁会出错的例子给我,我想看到锁的作用,非常感谢
_________________________________________________
因为两个线程是在微观上是以时间片轮流执行而不是同时执行
因此访问不会出现异常
但会把数据写"脏"
回复
hongtog 2005-02-21
楼主可以改写你的程序,以上程序还不行的。

先初始化 test *pt = new test;
pt->value = 1;

线程执行函数改成:
int ThreadProc(void *param)
{
test *ptt = (test*)param;
while(1)
{
ptt->value = 100 / ptt->value;//会出错,一个线程还在for循环中执行时,此时ptt->value == 0
//另一个线程执行到这里时就出错了
for(int i = 0; i < 99999999; i++)
{
Sleep(1000);
ptt->value = 0;
}
ptt->value = 1;
}
}
回复
aspvbjava 2005-02-21
我知道逻辑已经乱了,但我想知道为什么不出错,两个线程同时访问同一个对象的成员不出错么?

或者谁有简单的没有锁会出错的例子给我,我想看到锁的作用,非常感谢
回复
UDX协议 2005-02-21
完全同意楼上
回复
hongtog 2005-02-21
程序当然不会出错,但运算逻辑已乱了。

ptt->value += 100;
cout<<ptt->value<<endl;

看看输出的值还会不会是你期望的,每次都递增100
回复
aspvbjava 2005-02-21
把ptt->value = 100;改成ptt->value += 100;
也不出错
没有异常或死锁现象
回复
BigFanOfCpp 2005-02-21
把ptt->value = 100;改成ptt->value += 100;再试试.
永远设置成100当然不出错了,呵呵.
回复
rtdb 2005-02-21
1) 同楼上,你的线程没有同时运行
2)所有的线程做的事:ptt->value = 100;不可能出错
你可以试着改为ptt->value = ptt->value + 1 ;
也许最后就会加错了。

回复
gnixemos 2005-02-21
锁是防止出错, 不加锁有可能出错,但不是一定会出错(也有这种情况)
回复
老夏Max 2005-02-21
MyThread是线程吗?呵呵
回复
相关推荐
发帖
进程/线程/DLL
创建于2007-09-28

1.5w+

社区成员

VC/MFC 进程/线程/DLL
申请成为版主
帖子事件
创建了帖子
2005-02-21 01:42
社区公告
暂无公告