我有一个由两个线程调用的函数,每个线程都有一个向量的本地副本。我的假设是,由于每个线程都有不同的向量,因此下面的函数是线程安全的 以下函数是否是线程安全且可重入的?
bn
答案 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