我是多线程系统的新手,对于对象的合适数据结构有疑问。
我有一个具有多个属性的对象图像,其中两个是存储图像数据的字节数组数据和存储状态的int变量状态。
我有某种形式的传送带架构,这意味着有一个摄像机线程将数据存储到图像属性中,然后是转换器线程,然后是处理线程。因此,一个线程必须处理前一个线程的输出。
为避免同步和提高效率,我的想法是拥有一个LinkedList<Image>
存储图像对象。网络摄像头线程创建第一个图像对象,指定status = 1(表示正在进行数据写入),如果完成并指向下一个图像,则指定status = 2。以下转换器线程仅读取状态属性,如果它为1则休眠或等待(可以通过网络摄像头线程发出信号),如果为2,则分配状态3并开始工作。完成后,它设置status = 4并继续下一个图像对象。下一个线程再次读取状态,并在状态&lt; 4等等。
最后我的问题是,是否存在由两个不同线程可能同时访问引起的问题,同时确保只有一个是写操作而另一个(读)访问甚至是在不同的属性/变量上进行的(相同的对象)。
答案 0 :(得分:1)
即使单个线程修改了相同的共享数据,其他线程也只能执行读取,竞争和数据损坏。
请考虑以下事项:
Thread 1 | Thread 2
... | ...
--> not atomic! start writing shared resource | ...
--> data state is undefined here ... | read shared resource
end writing shared resource | ...
如果您可以确保在没有任何额外访问权限(读取或写入)的情况下对相同的共享数据进行写入访问,那么您将无法获得保护。
否则,您需要使用某种锁定机制保护共享资源,例如semaphore
或mutex
。从描述中听起来像是典型的consumer-producer
问题,请查看Synchronizing producer, consumer and a producer queue和类似的问题。