我的函数线程安全且可重入吗
Is my function thread-safe and reentrant?
我有一个函数,由两个线程调用,每个线程都有一个向量的本地副本。我的假设是,由于每个线程都有不同的向量,下面的函数是线程安全的
下面的函数线程安全且可重入吗?
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)
{
swap(i , j++ , arr);
}
}
return arr.size() - j;
}
void swap(int fromIndex , int toIndex , std::vector<int> &arr)
{
arr[fromIndex] = arr[fromIndex]^arr[toIndex];
arr[toIndex] = arr[fromIndex]^arr[toIndex];
arr[fromIndex] = arr[fromIndex]^arr[toIndex];
}
函数本身不是线程安全的,因为可以从不同的线程向它传递相同的向量。
但是,如果在这些函数之外进行同步,则可以使用非线程安全函数编写线程安全代码。也就是说,如果您的调用代码注意从不同时将相同的向量传递给该函数,那么调用代码将是线程安全的。
关于重新加入,维基百科有以下几点要说:
在计算中,如果它可以在执行过程中被中断,然后安全地执行在之前的调用完成之前再次调用("重新输入")处决中断可能是由诸如作为跳转或调用,或通过硬件等外部操作中断或信号。一旦重新输入的调用完成以前的调用将恢复正确执行。
我强调了该定义的最后一部分,因为很明显,一个非线程安全的函数可能无法正确执行,因此该定义无法重新输入。
如果函数更改了线程实例之间的共享内存,那么它就不是线程安全的。如果你有两个不同的对象(而不是指针)指向向量,那么你不必担心。
如果你想让它线程安全,你可以使用互斥,例如:
#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;
}
更多关于互斥的信息可以在这里找到
相关文章:
- 如何将元素添加到数组的线程安全函数?
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- C++使用params创建线程函数会导致转换错误
- 为什么std::async使用同一个线程运行函数
- 使用 std::string () const 函数启动线程或未来
- C++线程中,没有重载函数接受 X 参数
- 如何从线程中的不同模块调用函数?
- 如何在调用析构函数时优雅地停止/销毁带有阻塞调用C++线程?
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- 如何将类的成员函数传递给线程
- 是否可以创建一个从不同类调用函数的线程?
- 如何制作一个只能在一个线程上同时执行的函数?
- 启动类函数作为失去引用的线程
- 为什么即使调用了析构函数,C++11 中的分离线程也可以执行
- 非静态成员失败的线程调用函数
- 线程调用的函数对对象删除是否安全?
- 将类成员函数作为线程调用到另一个类成员函数时发出警告消息
- 类成员在构造函数(线程)之后更改地址
- C++无限依次运行两个函数(线程)
- c++将各种参数传递给父类构造函数(线程c++11)