我的函数是线程安全的还是可重入的?

时间:2015-04-25 14:40:54

标签: c++ multithreading pthreads

我有一个由两个线程调用的函数,每个线程都有一个向量的本地副本。我的假设是,由于每个线程都有不同的向量,因此下面的函数是线程安全的 以下函数是否是线程安全且可重入的?

bn

2 个答案:

答案 0 :(得分:2)

函数本身不是线程安全的,因为可以从不同的线程向它传递相同的向量。

但是,如果在这些函数之外进行同步,则可以使用非线程安全函数编写线程安全代码。即如果您的调用代码注意到同一个向量永远不会同时传递给该函数,那么调用代码将是线程安全的。

关于重新入境,Wikipedia有以下说法:

  

在计算中,如果计算机程序或子程序被称为可重入的   它可以在执行过程中被中断,然后安全地中断   在之前的调用完成之前再次调用(“重新输入”)   执行。中断可能是由内部行为引起的   作为跳转或呼叫,或通过硬件等外部动作   中断或信号。一旦重新进入的调用完成,   之前的调用将恢复正确执行

我强调了该定义的最后一部分,因为很明显,一个非线程安全的函数可能无法正确执行,因此无法通过该定义重入。

答案 1 :(得分:1)

如果函数在线程实例之间更改共享内存,则该函数不是线程安全的。如果向量有两个不同的对象(不是指针),那么你不必担心。

如果您想使其线程安全,您可以使用互斥锁,例如:

#include <thread>         // std::thread
#include <mutex>          // std::mutex

std::mutex mtx;           // mutex for critical section

int Partition(int high, int low, int pivot, std::vector<int>& arr)
{
    int j = low;
    for (int i = low ; i <= high ; i++)
    {
        if (arr[i] <= pivot)
        {
            mtx.lock();
            swap(i , j++ , arr);
            mtx.unlock();
        }
    }
    return arr.size() - j;
}

有关互斥锁的更多信息,请参见here