1

我对多线程系统很陌生,并且对对象的合适数据结构有疑问。

我有一个具有多个属性的对象图像,其中两个是存储图像数据的字节数组数据和存储状态的 int 变量状态。

我有某种形式的传送带架构,这意味着有一个相机线程将数据存储到图像属性中,然后是一个转换器线程,然后是一个处理线程。所以一个线程必须处理前一个线程的输出。

为了避免同步和提高效率,我的想法是有一个LinkedList<Image>存储图像对象。网络摄像头线程创建第一个图像对象,分配状态=1(表示数据正在写入),如果完成并转到下一个图像,则分配状态=2。以下转换器线程仅读取状态属性,如果为 1,则休眠或等待(可由网络摄像头线程发出信号),如果为 2,则分配状态 3 并开始工作。完成后,它将设置状态 = 4 并继续下一个图像对象。下一个线程再次读取状态,如果状态 < 4 则将休眠,依此类推。

最后我的问题是,两个不同线程可能同时访问是否会导致问题,同时确保只有一个是写操作,而另一个(读)访问甚至是在不同的属性/变量上进行的(相同的)目的)。

4

1 回答 1

1

即使单个线程修改相同的共享数据而其他线程只执行读取,也可能出现竞争和数据损坏。

考虑以下:

                                   Thread 1                       | Thread 2
                                   ...                            | ...  
--> not atomic!                    start writing shared resource  | ...
--> data state is undefined here   ...                            | read shared resource
                                   end writing shared resource    | ...

如果您可以确保在没有任何额外访问(读或写)的情况下对相同共享数据进行写访问,那么没有保护就很好。

否则,您需要使用某种锁定机制来保护您的共享资源,例如semaphoremutex。从描述听起来像是一个典型的consumer-producer问题,看看Synchronizing producer,consumer and a producer queue和类似的问题。

于 2012-11-29T14:14:43.240 回答