- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个由两个线程调用的函数,每个线程都有一个 vector 的本地拷贝。我的假设是,由于每个线程都有不同的 vector ,因此下面的函数是线程安全的。
下面的函数是线程安全的和可重入的吗?
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];
}
最佳答案
函数本身不是线程安全的,因为可以从不同的线程向它传递相同的 vector 。
但是,如果您在这些函数之外进行同步,则可以使用非线程安全函数编写线程安全代码。 IE。如果您的调用代码注意绝不会同时将同一个 vector 传递给该函数,则调用代码 将是线程安全的。
关于重入,Wikipedia有以下要说的:
In computing, a computer program or subroutine is called reentrant if it can be interrupted in the middle of its execution and then safely called again ("re-entered") before its previous invocations complete execution. The interruption could be caused by an internal action such as a jump or call, or by an external action such as a hardware interrupt or signal. Once the reentered invocation completes, the previous invocations will resume correct execution.
我强调了该定义的最后一部分,因为很明显,非线程安全的函数可能无法正确执行,因此无法通过该定义重入。
关于c++ - 我的函数是线程安全的和可重入的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29866585/
嗨,我已经阅读了 Java 中的 ReadWriteLock,但我不确定我是否掌握了它的重入部分。这是两个仅使用一个主线程来显示重入的简短代码示例 public class Locks { p
我在使用 NotifyIcons 时发现了一个重入问题。重现它真的很容易,只需在表单上放置一个 NotiftIcon,点击事件应该如下所示: private bool reentrancyDetect
我正在尝试使用 SQLite 的新 C 接口(interface)预更新 Hook : https://www.sqlite.org/c3ref/preupdate_count.html 现在回答我的
来自阅读here我发现 Actor 是可重入的,并且我希望以下情况成立:如果我有单一类型的转换 ThespianType 但有三个特定的 Actor ThespianType (T1、T2 和 T3)
有人可以向我解释一下 BlockReentrancy 的目的是什么吗?方法在ObservableCollection ? MSDN显示以下内容作为示例: //The typical usage is
我是一名优秀的程序员,十分优秀!