-
-
[求助]多线程的数据怎么同步?
-
发表于:
2013-6-6 15:00
7997
-
正在写一个程序
涉及到多线程同步的问题
具体的过程可以抽象为这样(线程A和B都不是主线程,是主线程开启的)
线程A 获取事物C的属性变量M 这个属性变量第一次设置为0 即M(初始)=0 (后面设置为从线程B中处理后的数据。)事物A先判断线程B是否启动,如果没启动则启动线程B 根据事物C的属性变量M 执行操作A的动作,接着执行操作B的动作 。[动作B的操作可以对事物C进行消费。比如inc(事物C)]
循环执行线程A的动作直到线程退出。线程B 判断事物C是否存在,不存在则创建(生产),获取事物新C的属性变量M,并且存储该数据到 事物C属性的变量M当中 即 M=新获取属性变量(C)
执行操作B的动作。动作B的操作可以对事物C进行消费。比如inc(事物C) 当事物C的某个数据=0
的时候 C 就被消费完了。循环执行线程B的动作直到线程退出。现在的问题就是 事物C的属性变量M 同时被两个线程操作 而且中间还有很多的其他步骤,我用了很多方法要么线程 堵塞 ,要么线程无法同步请问应该用什么方式同步?怎么同步?
伪代码 --不知道是不是可以这么说
创建线程A
1、M=线程B中获得的M(第一次为0,后面为线程B中获得)
2、判断(线程B是否启动)
3、没有启动 则启动线程B
4、执行动作A(M) ----消费这个数据消费完之后才允许它改变
5、执行动作B(inc(事物C)) 消费
6、回到1 直到线程A退出
创建线程B
1、判断是否存在(事物C)
2、不存在则创建(事物C) 生产
3、M=得到变量(事物C)----------- 不断生产这个 数据 并且给A进程消费
4、执行动作B(inc(事物C)) 消费
5、回到1 直到线程B退出
如何顺利的同步这两个线程?我用了
EnterCriticalSection(My);
try
finally
LeaveCriticalSection(My); //离开临界区
end;
结果线程B被阻塞了。。
主要的问题就是创建事物c之后 M要被重置(生产)。我是希望这个生产和
消费可以协调起来
B线程生产 A线程消费 A消费完 再B线程生产 这个应该怎么实现呢?
C++ DELPHI VB 易 JAVA(只要不是汇编)或者给个类似的伪代码都可以
http://bbs.pediy.com/showthread.php?t=173161
这个是一个其中的解决办法
但是我不知道怎么实现。。。郁闷啊
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课