我有一个将生成多个线程的应用程序。但是,我觉得线程访问数据不一定存在问题。
这是线程应用程序的结构(对不起粗糙):
MainThread
/ \
/ \
/ \
Thread A Thread B
/ \ / \
/ \ / \
/ \ / \
Thread A_1 Thread A_2 Thread B_1 Thread B_2
在每个字母线程(可能很多)下,只有两个线程,它们会按顺序触发。我遇到的问题是我不完全确定如何将数据结构传递到这些线程中。
因此,数据结构在MainThread中创建,将在特定于该线程的字母线程(线程A等)中进行修改,然后将该数据结构中的成员变量发送到Letter_Numbered线程。
目前,字母线程类有一个成员变量,当构造类时,来自mainthread的数据结构通过引用传入,调用复制构造函数,以便字母线程拥有它自己的副本。
lettered_numbered线程只是从字母线程中的数据结构中获取一个字符串变量。我的问题是,这是可以接受的吗?有没有更好的方法来确保每个字母线程都能获得自己的数据结构?
对于有些不好的解释感到抱歉,请留下评论,我会尽力澄清。
编辑: 所以我的字母线程构造函数应该采用数据结构的VALUE,而不是引用?
答案 0 :(得分:5)
我希望每个线程都创建自己的数据结构副本,例如您在构造函数中传递结构,然后显式创建本地副本。然后,您可以保证线程具有不同的副本。 (你说它是通过引用传递的,并且这会调用复制构造函数。我认为你的意思是通过值传递?我觉得最好明确地复制一份,毫无疑问地让你的意图明确。否则有人可能会在以后来吧,改变你的传递值,通过引用传递为“智能优化”。)
编辑:删除了关于字符串的评论。出于某种原因,我假设是.NET。
要确保字符串是私有的,请按照相同的步骤创建字符串的副本,然后您可以自由修改。
答案 1 :(得分:3)
有一种名为 Active Object Pattern 的模式,其中每个对象都在自己的线程中执行。像ACE这样的框架支持这一点。如果您可以访问此类框架,则应使用这些框架。在任何情况下,我都相信创建一个对象的新实例并允许它在自己的线程中进行exetute比调用复制构造函数来制作对象的副本更加清晰。否则,看看你是否适合使用Thread Local Storage的解决方案。
答案 2 :(得分:1)
你看过boost threads吗?
你基本上会创建一个可调用的类,它有一个构造函数,它接受线程要处理的参数,然后通过传递可调用类的对象来启动线程,初始化并准备就绪。
这与Java实现线程的方式非常相似,从设计的角度来看,它在大多数情况下都具有很大的意义。
答案 3 :(得分:1)
你几乎正在制作每个trhead的数据副本,一切正常吗?那没问题。
以下是一些额外的想法:
希望这有帮助。
答案 4 :(得分:-1)
您似乎不太可能希望每个线程对数据进行操作,然后至少偶尔会有另一个线程对另一个线程对另一个线程对数据的工作所做的事情做出反应。如果你是真正的独立意味着没有其他线程真正关心另一个线程所做的工作,那么我建议制作数据的副本,否则在你想要在一个线程中工作并产生结果的情况下我可以建议您使用另一个线程的工作,传递一个引用/指针到周围的对象,然后通过锁保护对它的访问,以便线程可以使用它,正确的,我建议一个多读,单个写入器锁定实施。