我想运行三个线程(i)一个应该将字符串附加到文件中。(ii)另一个线程应该从写入的流中删除特殊字符。(iii)第三个线程应该按升序对单词进行排序。如何我能以线程安全(同步)的方式做到吗?
我的意思是
线程1
sample.txt
Apple
Ma#22ngo
G@ra&&pes
线程2 (删除特殊字符sample.txt后)
Apple
Mango
Grapes
线程3(sample.txt)
Apple
Grapes
Mango
答案 0 :(得分:5)
为什么要使用多个线程执行此操作?也许您的示例过于简单,但如果您可以避免线程,那么这样做 - 看起来这个问题不需要它。
你有很多文件,或者一个非常大的文件,还是其他什么?你为什么不能一个接一个地执行这三个动作呢?
<强>更新强>
我觉得我至少应该尝试帮助你解决你所面临的根本问题。我认为您需要将您正在考虑的任务视为管道。你从字符串开始,删除特殊字符(清理),然后将它们写入文件。当你最终编写了所有字符串时,你需要对它们进行排序。
直到排序阶段的所有事情都可以并且应该由单个线程完成。读取字符串,清理它,将其写入文件,移动到下一个字符串。在将所有字符串干净地写入文件之前,排序的最后任务不会轻易发生。
如果您要编写和排序的文件很多,那么每个文件都可以由一个单独的线程来处理,但我会避免在处理任何一个给定文件时涉及多个线程。
答案 1 :(得分:2)
我会在写入文件之前删除特殊字符,在同一个线程中执行操作1和2。操作3不能与其他操作并行运行,因为在写入文件时,您无法读取和排序。所以基本上这些操作都是顺序的,将它们放入不同的线程是没有意义的。
答案 2 :(得分:0)
您应该实现ThredSafe队列(或使用Parallels扩展附带的队列)。
线程有共享信息的问题所以,即使理论上你的解决方案被视为一个完美的并行场景,现实是你不能让线程自由访问共享数据,因为当你这样做时,不好事情发生了。
相反,您可以使用同步机制,在本例中为ConcurrentQueue。这样你就会有这个:
ConcurrentQueue<string> queueStrings;
ConcurrentQueue<string> queueFile;
Thread1将字符串插入queueStrings队列。
Thread2从queueString中读取字符串,处理它们,然后将它们插入到queueFile队列中。
最后,Thread3从queueFile读取已处理的字符串并将其写入文件。