多线程如何共用一个变量?

eaglerock 2002-05-27 02:20:54
在主线程中定义了一个变量并赋了初值,辅助线程也要用到这个变量,请问应该怎么办?把变量设成全局变量能行吗?请大侠指点。
...全文
3751 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;//开锁
}

15,471

社区成员

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

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