如何确保线程安全调用

时间:2011-12-10 17:52:07

标签: c# multithreading

以下是我的情景:

  1. 从队列中取消消息(IBM MQ)
  2. 传递给异步进程(归档文件并从DB获取fileId)线程#1
  3. 粉碎xml消息并加入进程#2(所以我可以使用fileId)线程#2
  4. 使用fileId(来自线程#1和线程#2)将碎片数据发送到DB
  5. 与上面的步骤#2和#3并行,我将修改消息并发送到另一个队列线程#3
  6. 编辑:我考虑使用多个线程的原因是,对于步骤#5,我希望它修改xml并写入队列,无论步骤#2和#3是否失败。我正在考虑第2步和第3步,我可以分别存档和粉碎xml,以尝试加快这个过程。

    每天的消息数量(200,000到500,000)

    问题:如果我对上述所有三个进程使用相同的消息,我会遇到任何问题吗?我应该复制消息,以便在我修改步骤#5(线程#3)中的消息时,我没有任何问题吗?我仍然对多线程很无知,所以我只是想通过最好的方式来处理这种情况并获得最大的吞吐量。

    使用C#4.0。

    谢谢,

    取值

2 个答案:

答案 0 :(得分:3)

如果消息(被视为)不可变,则可以 所以你肯定需要在第5步中复制一份。

其余的:它几乎取决于所有事情。

由于I / O通道不同,您可能会看到线程的一些优势。

另一方面,如果有很多消息进入,则每条消息1个线程上的所有5个步骤可能同样或更好。

答案 1 :(得分:1)

在编写多线程应用程序时,共享状态是最大(如果不是最大)问题之一。你可以随时做所有的锁定工作,但仍然很难保持一切正常。 如果你可以使你的消息不可变(从某种意义上说,每次改变都会创建一个新对象)你就会没事,因为它不会成为任何共享状态。 但是,您应该考虑,有时不可变对象的成本甚至比获取锁定更加昂贵,甚至更棘手。但是,在你的位置,我会给不变性机会。