代码之家  ›  专栏  ›  技术社区  ›  Brett

多个线程之间的共享列表是否为争用条件?

  •  0
  • Brett  · 技术社区  · 15 年前

    我有一些多线程的代码,它们通常运行得很好,但每隔一段时间它就会崩溃。我试图找出问题所在,但是使用OpenMP会使问题变得更加困难(问题不会以串行方式发生)。我知道对一个变量(竞争条件)的多次访问常常会使程序崩溃。

    我有一个在多个线程之间共享的列表,我很好奇该列表上的push_back()是否是一个竞争条件的候选者,因此每隔一段时间就崩溃一次我的程序?如果是的话,有什么关于如何处理的建议吗?
    -速度是最重要的
    -我知道使用 #pragma omp critical 将解决争用条件,但可能会减慢应用程序的速度(有两个列表,因此我需要一个关键的而不是原子的)。

    我不确定这一点的唯一原因是我使用STL容器运行了几个测试,但从未使测试代码崩溃。

    任何建议都将不胜感激!
    事先谢谢你,

    2 回复  |  直到 15 年前
        1
  •  1
  •   Andy Mortimer    15 年前

    免责声明:我对OpenMP一无所知。但是,我可以说是的,两个线程同时对一个列表执行后推(或任何其他修改操作)将导致问题,与对单个变量相同。

    我不知道OpenMP为您提供了哪些工具来保护您不受此影响。避免这个问题的一些常见方法:

    1. 在变量的操作周围加上一个锁(如互斥锁)。
    2. 给每个线程一份它自己的列表副本,让它们保持独立。在进程结束时,作为一个单独的步骤,您可以合并来自不同线程的结果。(这是map reduce,差不多)。

    如果您有许多线程,并且第二种方法与您的算法相匹配,那么第二种方法可以提供更好的结果。有些算法不能这样构造。

    如果没有很多线程,根据循环体的大小,简单的锁可能是最有效的解决方案。

        2
  •  0
  •   Amardeep AC9MF    15 年前

    STL容器本质上不是线程安全的。您需要使用同步机制来保护对它们的访问。典型的可以是信号量或互斥量,互斥量通常是两者中的较快者。

    推荐文章