https://githubfast.com/834810071/NetworkProgramming.git
TBB
TBB官方文档
BenchMark
CMake:作为子模块
set(BENCHMARK_ENABLE_TESTING OFF CACHE BOOL "Turn off the fking test!")
关闭该模块的测试,该测试会找一些程序
任务域tbb::task_arena
嵌套for
如果有锁,可能会出现死锁问题,对一个锁2遍
指定线程数
死锁问题和工作窃取
size_t n = 1<<13;
std::vector<float> a(n * n);
std::mutex mtx;
tbb::parallel_for((size_t)0, (size_t)n, [&] (size_t i) {
std::lock_guard lck(mtx);
tbb::parallel_for((size_t)0, (size_t)n, [&] (size_t j) {
a[i * n + j] = std::sin(i) * std::sin(j);
});
});
?????????????真的吗??
std::recursive_mutex递归锁
递归锁是一种特殊类型的互斥锁,允许同一个线程多次获取同一个互斥锁而不会发生死锁。
任务域互相之间不会窃取线程
this_task_area::isolate
并行:如何均匀的分配任务到每个线程
解决方法1:线程超过cpu核心数
这时系统会时间片轮换在核心执行,让系统常用时间片轮换保证各个核心始终饱和。
缺点:时间片轮导致上下文切换频繁的格外开销
方法2:线程数=核数,用队列分发任务
方法3:工作窃取法
方法4:随机分配
任务切的更细,然后随机分配,只要数量够大,数学期望上就是每个线程工作量是均匀。