C++11 中的多线程

multi-threads in c++11?

本文关键字:多线程 C++11      更新时间:2023-10-16

好的,我正在使用Mac在c ++ 11中学习多线程。据我所知,所有线程都是同时执行的。我从这里找到了以下代码

// thread example
#include <iostream>       // std::cout
#include <thread>         // std::thread
void foo() 
{
    std::cout << "nIn foo n";
}
void bar(int x)
{
    std::cout << "nIn bar n";
}
int main() 
{
    std::thread first (foo);     // spawn new thread that calls foo()
    std::thread second (bar,0);  // spawn new thread that calls bar(0)
    std::cout << "main, foo and bar now execute concurrently...n";
    // synchronize threads:
     first.join();                // pauses until first finishes
    second.join();               // pauses until second finishes
    std::cout << "foo and bar completed.n";
    return 0;
} 

每次运行代码时,我都会得到奇怪的结果,如以下示例所示

aIIinnn ,bf aofroo o

和酒吧现在并发执行...foo和酒吧完成。

我错过了什么?

您同时通过两个线程的std::cout进行打印。 虽然这显然不是一场数据竞赛,因此是"安全的" [*],但正如你所看到的,输出它并不是特别有意义。 您可能希望使用std::mutex来限制访问,或使用提供更强大保证的 IO 库。

[*] 除非您致电std::cout.sync_with_stdio(false)

这是因为两个线程同时写入标准输出 std::out。您需要添加线程同步机制(互斥锁、信号量等),以确保一次只有一个线程写入 std::out。您面临的问题是由于线程彼此并行运行,这就是它们的目的。搜索互斥锁或信号量并将它们集成到您的代码中,您将解决问题。

如果多次运行当前代码,您将看到每次执行代码时或至少大多数时间的结果都会有所不同。

代码分为两部分。 第一部分是thread firstthread secondmain同时运行(即同时运行)。 结果,"n In foo n""n In bar n""main, foo and bar now execute concurrently...n"的打印将同时发生,因此输出将是它们的随机混合(更正式地称为赛车)。

也就是说,第一部分打印的是OP中提到的"随机输出",即"n In foo n""n In bar n""main, foo and bar now execute concurrently...n"的洗牌。

在第一部分之后,主线程将暂停,直到第一个线程和第二个线程完成(称为同步)。 因此,"foo and bar completed.n"的打印将始终产生精确的输出。