2023年12月14日
摘要: 1、错误:fatal error C1021: 无效的预处理器命令“warning” 2、错误定位:\cgal\include\CGAL\internal\enable_third_party_libraries.h 3、错误原因:未包含“gmp.h”文件的include路径 4、解决方式:添加“g 阅读全文
posted @ 2023-12-14 10:58 天官赐福 阅读(759) 评论(0) 推荐(0)
  2021年5月26日
摘要: 当涉及到共享数据时,问题很可能是因为修改共享数据所导致。如果共享数据是只读的,那么只读操作不会影响到数据,所以所有线程都会获得同样的数据。但是,当一个或多个线程要修改共享数据时,就会产生很多麻烦。 不变量:双链表中每个节点都有一个指针指向列表中下一个节点,还有一个指针指向前一个节点。其中不变量就是: 阅读全文
posted @ 2021-05-26 14:49 天官赐福 阅读(224) 评论(0) 推荐(0)
摘要: 第2章讨论了C++标准库中基本的线程管理方式:启动线程,等待结束和不等待结束(因为需要它们运行在后台)。并了解应该如何在线程启动前,向线程函数中传递参数,如何转移线程的所有权,如何使用线程组来分割任务。最后,讨论了使用线程标识来确定关联数据。 整章目录如下: 2 管理线程 2.1 基本线程管理 2. 阅读全文
posted @ 2021-05-26 14:05 天官赐福 阅读(39) 评论(0) 推荐(0)
摘要: 每个线程都有唯一的线程标识,其类型是 std::thread::id ,可以通过两种方式进行获取。第一种,可以通过调用与线程相关联的std::thread 对象的成员函数 get_id() 来直接获取。第二种,在当前线程中调std::this_thread::get_id()来获取。如果 std:: 阅读全文
posted @ 2021-05-26 13:56 天官赐福 阅读(67) 评论(0) 推荐(0)
摘要: 下例实现了一个并行版的 std::accumulate 。代码中将整体工作拆分成小任务交给每个线程去做,其中设置最小任务数,是为了避免产生太多的线程。 template<typename Iterator, typename T> struct accumulate_block { void ope 阅读全文
posted @ 2021-05-26 11:40 天官赐福 阅读(68) 评论(0) 推荐(0)
  2021年5月25日
摘要: std::move转移线程的所有权 与std::ifstream 与 std::unique_ptr一样,std::thread也是可移动的,而非可复制的。这意味着一个特定的执行线程的所有权可以在std::thread实例之间移动,但是,在任意时刻,只有一个std::thread对象与某个特定的线程 阅读全文
posted @ 2021-05-25 15:06 天官赐福 阅读(151) 评论(0) 推荐(0)
  2021年5月24日
摘要: 传递参数给线程函数 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 天官赐福 阅读(106) 评论(0) 推荐(0)
  2021年5月18日
摘要: 2.1 基本线程管理目录 阅读全文
posted @ 2021-05-18 10:56 天官赐福 阅读(37) 评论(0) 推荐(0)
摘要: 分离线程 我们已经知道了,可以通过调用join()来等待线程完成;如果无需等待线程完成,可以通过分离(detaching)线程来实现,在std::thread对象上调用detach()函数,会把线程丢在后台运行,没有直接的办法与之通信。 struct func; // 前面定义很多遍了 void o 阅读全文
posted @ 2021-05-18 10:47 天官赐福 阅读(112) 评论(0) 推荐(0)
  2021年5月17日
摘要: 如前所述,可以通过join()来等待线程完成。但是,当程序变得复杂时,程序的出口可能不止一个,如果主线程(我觉得它是,就这样吧)打算等待子线程完成,就需要仔细选择在代码的哪个位置调用join(),避免因为程序异常,跳过了对join()的调用。 struct func { int& i; func(i 阅读全文
posted @ 2021-05-17 18:32 天官赐福 阅读(74) 评论(0) 推荐(0)