C++ - 中的线程与异步

以前一直觉得golang中的channel在多线程的情况下够好用的了

最近刚刚看到了 c++ 中有关异步的写法

个人觉得在一些特定的应用场景之中,c++ 比 go 好用哎!

好吧,我不是一个真正的 gopher 😂

Thread in cpp

  • 线程部分比较简单,直接上代码,不多细说了
  • 有关线程的 join()detach() 方法稍微说一点
    • join() : 等待该线程结束之后才退出
    • detach() : 分离模式,各自线程结束了之后就直接退出,不存在上面的关系
  • 有的时候我们发现 main() 的线程结束了,其余的线程也会退出,从而造成我们的一些错误认知,认为 main() 的线程就是主线程,它退出之后其他的线程也会退出
  • 其实线程都是平等的,没有主次线程这一种说法
  • 之所以有上面说的那种情况就是因为 main()执行完之后, 会调用exit()。exit() 会让整个进程over终止,那所有线程自然都会退出。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include "buffer.hpp"
#include <iostream>
#include <thread>
#include <chrono>

int main() {
auto tf = []{
std::chrono::milliseconds dura(2000);
for (int i =0; i <10; ++i)
{
std::cout << "tf thread :" << i << std::endl;
std::this_thread::sleep_for(dura);
}
std::cout << "--- tf thread over ---" << std::endl;
};

std::thread t(tf);
t.detach();

std::chrono::milliseconds dura(1000);
for (int i =0; i <10; ++i)
{
std::cout << "main thread :" << i << std::endl;
std::this_thread::sleep_for(dura);
}
std::cout << "--- main thread over ---" << std::endl;

// t.join();
return 0;
}

async in cpp

basic usage

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <thread>
// #include <chrono>
#include <future>

int main() {
auto res = std::async([]{std::cout << "async-" << std::this_thread::get_id() << std::endl; return 666;});
std::cin.get();
std::cout << "main-" << std::this_thread::get_id() << std::endl;
return 0;
}
  • std::launch::deferred 惰性调用(延时执行),直到 res.wait() 的时候才执行
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <iostream>
    #include <thread>
    #include <future>

    int main() {
    auto res = std::async(std::launch::deferred,[]{std::cout << "async-" << std::this_thread::get_id() << std::endl; return 666;});
    std::cout << "main-" << std::this_thread::get_id() << std::endl;

    std::cin.get();
    res.wait();
    return 0;
    }

real async

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <thread>
#include <future>
#include <chrono>

int main() {
auto tf = []{
std::chrono::milliseconds dura(1000);
std::this_thread::sleep_for(dura);
return 12;
};

std::packaged_task<int()> task(tf);
auto result = task.get_future();

std::thread t(std::move(task));
t.detach();

std::cout << " --- " << std::endl;
std::cout << result.get() << std::endl;

return 0;
}