2021-09-15

c++11并发编程 - 笔记

thread调用join()的行为,还清理了线程相关的存储部分,这样 std::thread 对象将不再与已经完成的线程有任何关联。这意味着,只能对一个线程使用一次join();一
旦已经使用过join(), std::thread 对象就不能再次加入了,当对其使用joinable()时,将返回否(false)。

使用detach()会让线程在后台运行,这就意味着主线程不能与之产生直接交互。不过C++运行库保证,当线程退出时,相关资源的能够正确回收,后台线程的归属和控制C++运行库都会
处理。

插一句tls反调试的细节:
通过#pragma comment(Linker,“INCLUDE:_tls_used”)显示的申明crt库中定义的_tls_used变量,以便向_tls_used!AddressOfCallBacks域添加回调函数。

[为了使用CRT提供的TLS回调支持,需要我们声明一个存放在以“.CRT$XLx“为名的节里面,这里x是一个位于A和Z之间的字母。需要如此奇怪的节名是因为TLS回调指针需要进行内存排序的原因。为了理解这种特殊声明的作用,需要首先明白编译器和链接器是如何组织PE文件中的数据的。PE文件中,除了头部数据,其它均是分不同节存储的,节就是具有相同属性(也保护属性)集合的内存区域。关键字__declspec(allocate(“section-name”))告诉编译器在最终PE文件中其作用域内的内容放在指定的节内。编译器额外支持将相似名字的节合并为一个大节的功能。该功能通过使用节名前缀+$+任意字符串 的形式来激活。编译器将合并具有相同节名前缀的节为一个大节。编译器对于相似节采用字典顺序进行合并(对$后的字符串进行排序)。这意味着在内存中,位于节“.CRT$XLB”中的变量将在位于节“.CRT$XLA”中变量位置的后面,但是在位于节“.CRT$XLZ”中的变量的前面。 C运行时库利用编译器的这一特性来创建一个以NULL结尾的TLS回调数组(将节“.CRT$XLZ”中放置一个NULL指针)。因此为了保证声明的函数指针位于TLS回调数组内部,必须将它放在节“.CRT$XLx”中。]  
引自:https://bbs.pediy.com/thread-202136.htm
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值