怎么有效的协调多线程
如何有效的协调多线程?
我在做一个数据采集程序,想用两个线程来做,一个Thread1负责接收数据,另一个thread2负责把接收到的数据画到tchart上,数据保存在全局数组里,现在我碰到了如何将协调这两个线程的难题,我的逻辑是在thread1把数据接收进来保存到数组后,通知thread2,让它把刚才接收到的数据(在数组中) 画出来,画好后,再通知thread1,我已画好图了,让它继续把接收到的数据放到全局数组里来,如此循环往复.请问一下,该怎么办好?如果单用criticalSection感觉不行。 请大家指点一下,多谢了!
------解决方案--------------------
CRITICAL_SECTION 足够了。你需要清晰明白,你需要用 CS 保护什么。
现在,两个线程竞争的是对全局数组的访问,所以,不论是线程 1 写入全局数组,或者线程 2 从全局数组中读取数据,都需要 exclusive access,所以,用一个 CS 保护对这个数组的所有访问,就可以达到你的目的了。
有必要用两个线程么?
------解决方案--------------------
我个人的感觉这样比较合适一些。
数据放到一个队列里面,
一个线程放,一个线程读。
用criticalSection保护队列
------解决方案--------------------
我也感觉用CriticalSection就够了。
------解决方案--------------------
需要用多线程嘛?楼主的描述明显是一个单线程嘛
------解决方案--------------------
指点你一下吧,线程A和B,如果他们是协作方式(生产者、消费者方式),那么最好的设计方式是这样:
1:定义一个队列,这个队列里的内容是某个类型数据的指针。
2:把这个队列封装起来,提供 put 和 get 操作。这两个操作需要用同步机制同步起来,比如Windows平台的CriticalSection。外面不能直接访问这个数组。
3:队列要提供一个 empty() 函数,用于判断数组是否为空。empty函数也要用 put、get 的同步机制同步。get操作的同时,就把数据移出队列。
4:队列要提供清空操作,能在功能关闭时delete这些数据。清空操作也需要 put、get 的同步机制。
5:生产者A不断生产出数据(new出来),然后 put 到队列。
6:消费者B不断循环检测队列是否 empty(),如果empty(),就sleep 几个毫秒。如果有数据,就把数据 get 出来,然后操作这个数据,并且负责delete。
就这样A和B就工作完美了。
我在做一个数据采集程序,想用两个线程来做,一个Thread1负责接收数据,另一个thread2负责把接收到的数据画到tchart上,数据保存在全局数组里,现在我碰到了如何将协调这两个线程的难题,我的逻辑是在thread1把数据接收进来保存到数组后,通知thread2,让它把刚才接收到的数据(在数组中) 画出来,画好后,再通知thread1,我已画好图了,让它继续把接收到的数据放到全局数组里来,如此循环往复.请问一下,该怎么办好?如果单用criticalSection感觉不行。 请大家指点一下,多谢了!
------解决方案--------------------
CRITICAL_SECTION 足够了。你需要清晰明白,你需要用 CS 保护什么。
现在,两个线程竞争的是对全局数组的访问,所以,不论是线程 1 写入全局数组,或者线程 2 从全局数组中读取数据,都需要 exclusive access,所以,用一个 CS 保护对这个数组的所有访问,就可以达到你的目的了。
有必要用两个线程么?
------解决方案--------------------
我个人的感觉这样比较合适一些。
数据放到一个队列里面,
一个线程放,一个线程读。
用criticalSection保护队列
------解决方案--------------------
我也感觉用CriticalSection就够了。
------解决方案--------------------
需要用多线程嘛?楼主的描述明显是一个单线程嘛
------解决方案--------------------
指点你一下吧,线程A和B,如果他们是协作方式(生产者、消费者方式),那么最好的设计方式是这样:
1:定义一个队列,这个队列里的内容是某个类型数据的指针。
2:把这个队列封装起来,提供 put 和 get 操作。这两个操作需要用同步机制同步起来,比如Windows平台的CriticalSection。外面不能直接访问这个数组。
3:队列要提供一个 empty() 函数,用于判断数组是否为空。empty函数也要用 put、get 的同步机制同步。get操作的同时,就把数据移出队列。
4:队列要提供清空操作,能在功能关闭时delete这些数据。清空操作也需要 put、get 的同步机制。
5:生产者A不断生产出数据(new出来),然后 put 到队列。
6:消费者B不断循环检测队列是否 empty(),如果empty(),就sleep 几个毫秒。如果有数据,就把数据 get 出来,然后操作这个数据,并且负责delete。
就这样A和B就工作完美了。