线程访问全局变量卡住的问题

LiSCode 2010-05-22 10:45:25


BOOL bStop=FALSE;//这是个全局变量

UINT thread1(LPVOID lparam)
{
//其他代码
......


while(!bStop)//问题就出在这,当点击按钮,使bStop=TRUE;时,就会卡在这不动了,
//我怀疑是,改变变量的同时恰好这里在访问这个变量,应该怎么解决呢?
{

//其他代码
......

if(bStopFlux)//或者问题出在这,
{

// break;
}

//其他代码
......


}


return 0;
}
void CClass1::OnButStartLis() //这个按钮用于启动线程
{
AfxBeginThread(thread1,this);
}
void CClass1::OnButStop() //这是个按钮响应函数
{
bStop=TRUE;//目的是把这个全局变量设置成TRUE,好让线程自己退出
}
...全文
269 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
LiSCode 2010-05-26
  • 打赏
  • 举报
回复
问题已解决
LiSCode 2010-05-22
  • 打赏
  • 举报
回复
当我第二次点开始的时候,代码应该创建一个新的线程,但是并没有创建新的线程,而是刚才那个卡在那退不出来的线程退出了,注意是正常退出,不是线程崩溃,或者强制退出

所谓正常退出,就是他刚才卡的那个地方可以正常访问那个全局变量了,发现是TRUE,就退出循环了!

第三次点开始的时候,又正常的创建了一个新的线程
LiSCode 2010-05-22
  • 打赏
  • 举报
回复
我把
InterlockedExchange(((long *)bStopFlux),TRUE);

改成
bStopFlux=TRUE;

就不崩了,但是还是卡在那个地方,线程退不出来
LiSCode 2010-05-22
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 zhou1xp 的回复:]
CListCtrl的指针应该传进你的线程,不能直接使用的,把你的代码完全贴出来,你第一次写线程??
[/Quote]

我当然不是第一次写线程了,不过是第一次遇到这种问题,我印象中,访问全局变量应该不会出现这种问题。

但是源码 1是没必要全部贴出来,2 是公司的代码,不方便贴
zhou1xp 2010-05-22
  • 打赏
  • 举报
回复
CListCtrl的指针应该传进你的线程,不能直接使用的,把你的代码完全贴出来,你第一次写线程??
LiSCode 2010-05-22
  • 打赏
  • 举报
回复
另外我点了停止按钮后,bStop的值居然是0

停止按钮的代码是这样的

InterlockedExchange(((long *)bStopFlux),TRUE);
stonewater 2010-05-22
  • 打赏
  • 举报
回复
就你的代码来看,卡住应该是别的原因,当然了,你这种写法也不太好,你再检查下中间省略掉的代码看看
LiSCode 2010-05-22
  • 打赏
  • 举报
回复
另外我点了停止按钮后,bStop的值居然是0 !!

停止按钮的代码是这样的

InterlockedExchange(((long *)bStopFlux),TRUE);
LiSCode 2010-05-22
  • 打赏
  • 举报
回复
崩溃的地方找到了,是线程里面需要访问对话框的CListCtrl控件

pDlg->m_List......//这里崩溃

但是不知道为什么会这样,以及怎么改?

但可以肯定的是,在没有点停止按钮之前,是不崩的,线程对列表控件的读写没有任何问题。
LiSCode 2010-05-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zhou1xp 的回复:]
你要退出线程用事件就可以了,你要这样做就应该在你的按钮函数中使用原子操作
[/Quote]

原子操作?最好给个例子
zhou1xp 2010-05-22
  • 打赏
  • 举报
回复
你要退出线程用事件就可以了,你要这样做就应该在你的按钮函数中使用原子操作
yangyang__ 2010-05-22
  • 打赏
  • 举报
回复
在thread1中编译器应该优化得只是根据某个寄存器的值来判断是不是继续循环,所以加volatile还是必要的.上面各位说得也有道理,InterlockedExchange可以不加.

崩了可能就是别的原因了吧,比如说你的thread1在等一个别的事件完成,比如读一个文件什么的,而你的主线程已经退出了等等,这原因可就多了.
LiSCode 2010-05-22
  • 打赏
  • 举报
回复
首先我必须这么写,否则编译报错

InterlockedExchange(((long *)bStopFlux),TRUE);


变量已经写成下面这样了
volatile BOOL bStopFlux=FALSE;
然后,编译没错了,但是执行的时候崩溃!!!!
weblai 2010-05-22
  • 打赏
  • 举报
回复
临界,原子操作,等,都是用于,多个线程又要读,多个线程又要写的情况。
wltg2001 2010-05-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yonghengzhimi 的回复:]
引用 2 楼 yangyang__ 的回复:
把::OnButStop()中bStop=TRUE改成调用InterlockedExchange,另外把bSop的定义加上volatile.



后半句明白,前半句不明白

你的意思是吧bStop=TRUE这句去掉,然后加上InterlockedExchange
还是不去掉那句,在后面加上InterlockedExchange ?
……
[/Quote]
他的意思是用InterlockedExchange来改变bStop的值,可以写作:
InterlockedExchange(&bStop,TRUE);
weblai 2010-05-22
  • 打赏
  • 举报
回复
我以前的代码,都是像你这样做的,没有出过任何问题。

对于一个全局变量,只要注意,不管在多少个线程里,它们都只读取.

只有一个线程,是写的。

感觉你的问题不在这上面。
LiSCode 2010-05-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yangyang__ 的回复:]
把::OnButStop()中bStop=TRUE改成调用InterlockedExchange,另外把bSop的定义加上volatile.
[/Quote]


后半句明白,前半句不明白

你的意思是吧bStop=TRUE这句去掉,然后加上InterlockedExchange
还是不去掉那句,在后面加上InterlockedExchange ?

另外InterlockedExchange的参数怎么传?

干脆你给我写出来得了,非常感谢
yangyang__ 2010-05-22
  • 打赏
  • 举报
回复
把::OnButStop()中bStop=TRUE改成调用InterlockedExchange,另外把bSop的定义加上volatile.
wltg2001 2010-05-22
  • 打赏
  • 举报
回复
用临界区
向立天 2010-05-22
  • 打赏
  • 举报
回复
老问题了
是不是你跨线程操作界面元素了
MFC对象不是线程安全的
你重新规划一下程序
把相关操作通过发消息的方式实现

15,472

社区成员

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

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