锁到底有什么用处?

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;
}
...全文
144 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
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是线程吗?呵呵

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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