社区
进程/线程/DLL
帖子详情
两线程 不同步共享数据问题?
ybeetle
2003-03-27 11:44:29
有全局变量 int a;
有两个线程A,B;
两线程同时运行,其中A不断改变a的值,B不断读取a的值。
其中不使用同步,B得到的a的值当然是未知数,
理论上系统会出错吗?
...全文
129
52
打赏
收藏
两线程 不同步共享数据问题?
有全局变量 int a; 有两个线程A,B; 两线程同时运行,其中A不断改变a的值,B不断读取a的值。 其中不使用同步,B得到的a的值当然是未知数, 理论上系统会出错吗?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
52 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
qiufuwang
2003-05-17
打赏
举报
回复
up
wabc
2003-05-17
打赏
举报
回复
在solaris和windows上使用,未出现过错误。
缺页中断应该是在指令执行前发生,可以认为是一个trap
ybeetle
2003-05-14
打赏
举报
回复
只有把程序反编译来看代码,要弄清原子操相当麻烦。
可能只有在可以出少数错误的情况下才能这样用,比如界面显示时可以用。
alphapaopao
2003-05-08
打赏
举报
回复
我认同 mingbao(★情已逝★) 的解释。
接下来,我们来讨论一下操作系统如何实现原子操作的吧。
strongerman
2003-05-07
打赏
举报
回复
up
pason
2003-04-28
打赏
举报
回复
回复niukl:
test::a的地址不是对齐的
pason
2003-04-28
打赏
举报
回复
可以结贴了,zcpro说的很详细了。
alend
2003-04-28
打赏
举报
回复
通过事件同步
mingbao
2003-04-28
打赏
举报
回复
另外,B进程可能会漏收数据或者多次接收同一数据的可能!
mingbao
2003-04-28
打赏
举报
回复
可能会出错,Windows的内存管理采用的是缺页中断机制,也就是说当系统发现程序要访问的数据不在内存中时,会产生一个缺页中断,将存有数据的页面从对换区(外存)调进来。缺页中断不像一般的中断,它在一条指令执行到中间时发生,而一般的中断都不可能在一条指令正在执行时发生,往往要等到一条指令执行结束,再转入中断!
同时, 如果机器指令长度超过一个字节, 内存寻址又允许间接寻址的话, 一条指令在执行期间最多可能产生6 次中断!
blue_fairy
2003-04-28
打赏
举报
回复
这里有这样一个问题,如果B在多处读取a的值,可能会出现问题。比如:
if ( a ) // 此时 a != 0.
strcpy(str_buf, (char*)a); // 此时a 被A线程改成了 0 or unvalid address.
ybeetle
2003-04-27
打赏
举报
回复
我也是这么想的。。。
niukl
2003-04-27
打赏
举报
回复
#pragma pack(push, 1)
struct test
{
char ch;
int a;
};
test::a的地址应该是对齐的
sharp_shooter
2003-04-25
打赏
举报
回复
花
zcpro
2003-04-25
打赏
举报
回复
一般不会出错,不过可能出现漏读的可能,例如A在一个时间片里连续多次改变该变量。
不过如果该变量的地址没有对齐,我想有可能出错,因为程序要读取内存两次才能取出该变量的值。
例如:
#pragma pack(push, 1)
struct test
{
char ch;
int a;
};
test::a的地址没对齐可能出错。
strongerman
2003-04-25
打赏
举报
回复
我也在写多线程服务器,但我想再大型的应用级别也不会至于每秒钟1000次,也很难想象有一个服务器有这种需求。除非是极端环境 或 极端条件下的科学实验吧:)
pason
2003-04-24
打赏
举报
回复
你可以看一下写数据的那段汇编代码,看写的过程是否就一条汇编语句,如果是的话,应该不会都错。
weijiechen
2003-04-24
打赏
举报
回复
gz
alphapaopao
2003-04-24
打赏
举报
回复
楼上,DWORD在32为机器上,可能是原子操作,在16位机器上理所当然不会是原子操作。
johndotcom
2003-04-24
打赏
举报
回复
LONG InterlockedDecrement(
LONG volatile* lpAddend
);
LONG InterlockedIncrement(
LONG volatile* lpAddend
);
这两个函数是原语操作,由操作系统实现,如果写一个DWORD是原语,那也没有必要
由这两个函数吧?
加载更多回复(32)
Qt高级系列之8:Qt多
线程
线程
池
数据
同步
机制及文件下载器项目实战
1.带领您深入学习QT5/C++:Qt多
线程
线程
池及
数据
同步
机制 ,多
线程
文件下载器项目实战,继承自QThread,继承自QObject,QRunnable和QThreadPool,QtConcurrent,Qt多
线程
技术与
数据
加锁保护机制:QMutex,QSemaphore,QReadWriteLock,QWaitCondition;Qt
线程
池技术、Qt
数据
库连接池、等。2.所有章节均有理论知识介绍、接口讲解、实例代码讲解,讲解过程中不断穿插老师在开发过程中遇到的
问题
及解决方法(可以下载所有的电子课件与源码)。
什么叫
线程
间的
数据
共享
?如何实现
线程
间的
数据
共享
?
线程
间的
数据
共享
一、为什么要实现
线程
间的
数据
共享
1.
线程
运行方式默认为并行运发2.什么是串行运行?二、如何实现
线程
间的
数据
共享
(多
线程
同步
原理)1.为什么通过synchronized就能实现多
线程
间串行运行呢?①只能有一个
线程
位于临界区②临界区中的代码具有互斥性、唯一性和排它性:2.误区:“
共享
数据
”是一个表达式相同,内容不同的非
共享
数据
三、synchronized关键字1.声明
同步
方法2.声明同...
线程
同步
的方法有哪些?
一、
线程
同步
和
线程
互斥 首先我们要清楚什么是
线程
同步
和
线程
互斥: 1、
线程
同步
:
线程
同步
指的是多个
线程
之间协调
同步
,按照预定的先后次序进行运行,这种先后次序取决于要完成的特定任务,最基本的场景就是:A
线程
要完成的任务依赖于B
线程
的
数据
。 2、
线程
互斥:
线程
互斥是指对于
线程
共享
的
线程
资源,在各个
线程
访问时具有排它性。当有若干个
线程
要访问同一
共享
资源时,任何时刻只允许一个
线程
进行访问,直到占有资源...
如何在
两
个
线程
之间
共享
数据
文章目录前言方法一方法二 前言 Java 里面进行多
线程
通信的主要方式就是
共享
内存的方式。
共享
内存主要有三个关注点:可见性、有序性、原子性。 Java内存模型(JVM)解决了可见性和有序性的
问题
,而锁解决了原子性的
问题
。 在理想情况下,我们希望做到
同步
和互斥来实现
数据
在多
线程
环境下的一致性和安全性。常用的实现多
线程
数据
共享
的方式有将
数据
抽象成一个类,并将对这个
数据
的操作封装在类的方法中;将Runnable对象作为一个类的内部类,将
共享
数据
作为这个类的成员变量。 方法一 将
数据
抽象成一个类,并将对这个
线程
之间的
数据
共享
线程
之间的
数据
共享
问题
可以分为
两
类,一类是执行代码一直的的
线程
共享
线程
共享
,另一类是执行代码不一致的
线程
共享
问题
。接下来分别进行总结。 一、执行代码一致的
线程
共享
问题
如果每个
线程
执行的代码执行的代码相同,那么可以使用同一个runnable对象,这个runnable里面的
数据
共享
。例如下面
线程
,启动五个
线程
,
共享
一个
数据
对j的操作。 public class Test { sta...
进程/线程/DLL
15,471
社区成员
49,181
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章