社区
进程/线程/DLL
帖子详情
多线程如何共用一个变量?
eaglerock
2002-05-27 02:20:54
在主线程中定义了一个变量并赋了初值,辅助线程也要用到这个变量,请问应该怎么办?把变量设成全局变量能行吗?请大侠指点。
...全文
3803
8
打赏
收藏
多线程如何共用一个变量?
在主线程中定义了一个变量并赋了初值,辅助线程也要用到这个变量,请问应该怎么办?把变量设成全局变量能行吗?请大侠指点。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
atling
2002-05-27
打赏
举报
回复
同一个进程下的所有线程使用同一个内存空间。大家现在开始讨论的是同步的问题了。对于一个变量,使用InterlockedExchange好像简单一些,用不着更复杂的方式。
另外:g_bLock = true;并不能完成加锁,因为它也不能保证是(甚至可以肯定不是)在一条汇编语句中完成。如果还要考虑缓冲,就更复杂了。
Yokishiro
2002-05-27
打赏
举报
回复
线程同步
关键代码段,内核对象同步,都可以考虑
The_Gathering
2002-05-27
打赏
举报
回复
to liugy(光哥):
你这样做理论上是不行的,因为if (g_bLock == false)并非是一个原子操作,这样还是会出问题的。windows提供了互斥器,信号量等一系列方法解决问题。
step_by_step
2002-05-27
打赏
举报
回复
to liugy(光哥)
你的算法有点问题。
假设现在有两个线程thread1和thread2。
int g_nTest;//主线程
bool g_bLock=false;//各个线程都用
1 if(g_bLock==false)//如果没有加锁
2 {
3 g_bLock = true;//加锁
4 使用变量g_nTest;
5 .......
6 g_bLock = false;//开锁
7 }
现在thread1先执行,因为一开始g_bLock是false所以它执行完1后准备执行2但是这时它的时间片用完了,所以只有开始休眠。而此时thread2开始执行1测试后g_bLock是false所以它也可以进入临界区了,此时thread1又被调度到了,开始从1后面2前面执行了。结果可想而知临界区被两个thread同时访问了,肯定出问题了!!
你的这个算法是因为你没有保证你的那个判断语句的原子性,所以出了问题,如果想要互斥的话,最好用系统调用产生互斥体或者是临界区。
以上是一孔之见。希望提出异议。
Bind
2002-05-27
打赏
举报
回复
呵呵,楼上有意思。这样做g_bLock这个变量也得保护起来才行啊!
楼主应该采用的方法是:事件、临界区、互斥信号等做法。MSDN上有例子的。
Q_O
2002-05-27
打赏
举报
回复
用全局变量和互斥体
不解
2002-05-27
打赏
举报
回复
当然可以!另外也可以考虑用参数传递;利用共享内存也是一种解决方案吧!
liugy
2002-05-27
打赏
举报
回复
可以,不过再加一个同步变量
比如:
int g_nTest;//主线程
bool g_bLock=false;//各个线程都用
使用之处:
先
if(g_bLock==false)//如果没有加锁
{
g_bLock = true;//加锁
使用变量g_nTest;
.......
g_bLock = false;//开锁
}
多线程
共用
一个
数据
变量
需要注意什么?
如果只是对
变量
进行读取没有写入的话,那么不需要进行特殊的...可以用volatile来保证操作(对
变量
的读写)的可见性,如果这还不能保证线程安全的话,那么就要使用加锁来保证操作的可见性和原子性来保证线程安全。 ...
linux
多线程
共用
一个
变量
不使用互斥锁实现线程间同步
在Linux中,如果你想要在多个线程之间共享
一个
变量
,并且你想要确保
一个
线程写入而另
一个
线程读取时能够及时同步,你可以使用原子操作。while (atomic_load(&shared_var) ) { // 原子加载操作。这些操作都是原子的,...
【面试题】Java
多线程
如何共享
变量
?
其中
一个
问题是:Java
多线程
怎么保证
变量
的可见性?听到问题之后,我懵了…… 在网上搜索学习了一下,简单概括如下: Java中可以通过synchronized、volatile、java concurrent类来实现共享
变量
的可见性。 1....
多线程
:
共用
一个
变量
问题
1.创建
一个
实现了Runable接口的类 2.实现类去实现Runnable中的抽象方法:run() 3.创建实现类的对象 4.将此对象作为参数传递到Thread类中的构造器中,创建Thread类的对象 5.通过Thread类的对象调用start()...
qt
多线程
访问同一
变量
_何时用
多线程
?
多线程
需要加锁吗?线程数多少最合理?
今天看到
一个
问题,突然有感而发,想聊下这个话题。不知道大家有没有想过这个问题,就是什么时候我该使用
多线程
呢?使用
多线程
就一定会提升系统性能吗?1、其实是否应该使用
多线程
在很大程度上取决于应用程序的类型...
进程/线程/DLL
15,473
社区成员
49,171
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章