3.1 共享数据带来的问题
摘要:当涉及到共享数据时,问题很可能是因为修改共享数据所导致。如果共享数据是只读的,那么只读操作不会影响到数据,所以所有线程都会获得同样的数据。但是,当一个或多个线程要修改共享数据时,就会产生很多麻烦。 不变量:双链表中每个节点都有一个指针指向列表中下一个节点,还有一个指针指向前一个节点。其中不变量就是:
阅读全文
posted @
2021-05-26 14:49
天官赐福
阅读(236)
推荐(0)
2 管理线程
摘要:第2章讨论了C++标准库中基本的线程管理方式:启动线程,等待结束和不等待结束(因为需要它们运行在后台)。并了解应该如何在线程启动前,向线程函数中传递参数,如何转移线程的所有权,如何使用线程组来分割任务。最后,讨论了使用线程标识来确定关联数据。 整章目录如下: 2 管理线程 2.1 基本线程管理 2.
阅读全文
posted @
2021-05-26 14:05
天官赐福
阅读(46)
推荐(0)
2.5 标识线程
摘要:每个线程都有唯一的线程标识,其类型是 std::thread::id ,可以通过两种方式进行获取。第一种,可以通过调用与线程相关联的std::thread 对象的成员函数 get_id() 来直接获取。第二种,在当前线程中调std::this_thread::get_id()来获取。如果 std::
阅读全文
posted @
2021-05-26 13:56
天官赐福
阅读(86)
推荐(0)
2.4 在运行时选择线程数量
摘要:下例实现了一个并行版的 std::accumulate 。代码中将整体工作拆分成小任务交给每个线程去做,其中设置最小任务数,是为了避免产生太多的线程。 template<typename Iterator, typename T> struct accumulate_block { void ope
阅读全文
posted @
2021-05-26 11:40
天官赐福
阅读(76)
推荐(0)
2.3 转移线程的所有权
摘要:std::move转移线程的所有权 与std::ifstream 与 std::unique_ptr一样,std::thread也是可移动的,而非可复制的。这意味着一个特定的执行线程的所有权可以在std::thread实例之间移动,但是,在任意时刻,只有一个std::thread对象与某个特定的线程
阅读全文
posted @
2021-05-25 15:06
天官赐福
阅读(168)
推荐(0)
2.2 传递参数给线程函数
摘要:传递参数给线程函数 void f(int i, string s) { for (size_t per = 0; per < i; per++) { cout << per << "-" << s[per] << endl; } } int main() { std::string s = "hel
阅读全文
posted @
2021-05-24 13:36
天官赐福
阅读(130)
推荐(0)
2.1.4 在后台运行线程
摘要:分离线程 我们已经知道了,可以通过调用join()来等待线程完成;如果无需等待线程完成,可以通过分离(detaching)线程来实现,在std::thread对象上调用detach()函数,会把线程丢在后台运行,没有直接的办法与之通信。 struct func; // 前面定义很多遍了 void o
阅读全文
posted @
2021-05-18 10:47
天官赐福
阅读(130)
推荐(0)
2.1.3 在异常环境下的等待
摘要:如前所述,可以通过join()来等待线程完成。但是,当程序变得复杂时,程序的出口可能不止一个,如果主线程(我觉得它是,就这样吧)打算等待子线程完成,就需要仔细选择在代码的哪个位置调用join(),避免因为程序异常,跳过了对join()的调用。 struct func { int& i; func(i
阅读全文
posted @
2021-05-17 18:32
天官赐福
阅读(81)
推荐(0)
2.1.2 等待线程完成
摘要:如果你想确保在主线程退出前,子线程已经执行完毕,可以通过结合(joining)线程,来等待一个线程的完成。通过在相关联的std::thread示例上调用join()函数来实现,调用后,主线程在子线程运行期间将做不了任何有用的事,唯有等待。 struct func { int& i; func(int
阅读全文
posted @
2021-05-17 14:49
天官赐福
阅读(89)
推荐(0)
2.1.1 启动线程
摘要:使用C++线程库来开始一个线程,需要构造一个std::thread对象。 void do_some_work(); std::thread my_thread(do_some_work); std::thread的构造函数参数可接受任何可调用对象,所以,可以将一个带有调用运算符的类的实例传递给std
阅读全文
posted @
2021-05-07 17:56
天官赐福
阅读(73)
推荐(0)