我有一堂动物课
class Animal
{
public:
int operator()(const int n=4)
{
// do something that takes a while(~1 ms)
return n*5;
}
};
如果我生成两个线程,每个线程都可以访问 Animal 的一个实例,函数调用是否会并行运行?或者第二个线程必须等待第一个线程完成吗?
更具体地说,在每个线程内我都有一个指向同一个 Animal 实例的指针,在线程内我称之为
(*pointer_to_animal)(10);
我知道从两个线程访问数据时存在竞争条件,但由于函数内使用的所有变量都是在堆栈上传入或创建的,因此不存在竞争条件。我希望两个线程针对同一个 Animal 实例并行运行。
是的,除非该函数执行某些操作(例如,保留互斥锁)来阻止并行执行,否则它完全有可能同时在多个线程中执行。
如果我生成两个线程,每个线程都可以访问 Animal 的一个实例,函数调用是否会并行运行?
是的。
或者第二个线程必须等待第一个线程完成吗?
否,除非您提供自己的同步,例如使用
std::mutex
或 std::condition_variable
,或等效的平台原语。
我希望两个线程针对同一个动物并行运行 实例。
操作系统的调度程序处理并发执行。您的线程将同时运行,每个线程都会获得一段 CPU 时间。操作系统的内核会进行从一个线程到另一个线程的上下文切换。您的 2 个线程很可能在 2 个独立的内核或单个内核上运行。所以要记住的关键词是“并发”