Chapter 15 Concurrency – A Tour of C++

15.2 Tasks and threads

如果某种运算能够与其他运算同时进行,那么我们将其称为task。而一个程序中的task,在系统层面则被称为thread。通过构建一个std::thread,我们可以执行一个能够同时运行的task。一个task可以是一个函数或者一个function object。

void f(); // 函数

struct F
{
    void operator() (); // function object
}

void user()
{
    thread t1 {f};   // f()将在独立的thread中执行
    thread t2 {F()}; // F()()将在独立的thread中执行

    t1.join();       // 等待t1
    t2.join();       // 等待t2
}

函数join()将会保证,我们直到thread完成之后才会退出user()。

一个程序中的thread将会分享同一个地址空间。也就是说,每个process的thread将会各有不同,它们一般不会直接共享数据。由于thread共享一个地址空间,他们可以通过共享的对象进行交互。这一类交互通常被lock或者其他的机制所控制,以防止数据冲突。

多线程下的编程将会较为复杂。假设任务f(函数)与F(function object)的实现如下:

void f()
{
    cout << "Hello";
}

struct F
{
    void operator()() { cout << "Parallel World!\n"; }
};

上述代码中f与F()都使用了cout,但是没有进行任何形式的同步。最后的输出结果将变得不可预测。程序可能会输出“PaHerallllel o World!”。

当我们定义多线程程序的任务时,我们的目标是保持任务的独立性。

15.3 Passing Arguments

留下评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据