从不同线程调用函数会阻塞?

问题描述 投票:0回答:3

我有一堂动物课

    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 实例并行运行。

c++ multithreading
3个回答
2
投票

是的,除非该函数执行某些操作(例如,保留互斥锁)来阻止并行执行,否则它完全有可能同时在多个线程中执行。


2
投票

如果我生成两个线程,每个线程都可以访问 Animal 的一个实例,函数调用是否会并行运行?

是的。

或者第二个线程必须等待第一个线程完成吗?

否,除非您提供自己的同步,例如使用

std::mutex
std::condition_variable
,或等效的平台原语。


0
投票

我希望两个线程针对同一个动物并行运行 实例。

操作系统的调度程序处理并发执行。您的线程将同时运行,每个线程都会获得一段 CPU 时间。操作系统的内核会进行从一个线程到另一个线程的上下文切换。您的 2 个线程很可能在 2 个独立的内核或单个内核上运行。所以要记住的关键词是“并发”

© www.soinside.com 2019 - 2024. All rights reserved.