太原做网站联系方式,网站编程代码大全,上海协策网站,网站建设首页[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ联系: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、D…[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ联系: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delphi、XCode、Eclipse、C Builder 技能种类: 逆向 驱动 磁盘 文件 研发领域: Windows应用软件安全/Windows系统内核安全/Windows系统磁盘数据安全/macOS应用软件安全 项目经历: 磁盘性能优化/文件系统数据恢复/文件信息采集/敏感文件监测跟踪/网络安全检测
[序言] 这几天在认真学习C 11标准以上的多线程规范. C 11标准中, 引入了thread_local线程局部变量, 顾名思义, 就是当一个变量具有thread_local属性时, 那么该变量在当前线程中会生成一个变量副本, 不会直接引用原变量. 这个特性在多线程时非常有用的. 但是, 今天在写一个测试代码时, 如果在线程中引入了Lamdba表达式, 并且尝试捕获thread_local线程局部变量时, 是失败的.
[非常危险的多线程代码示例]
// 全局的线程局部变量
thread_local int gint_X 1 ;void g_fun_Thread_Demo(std::wstring str_param_Info)
{for (int int_Index 0; int_Index 10; int_Index) {std::this_thread::sleep_for(std::chrono::seconds(3)) ;gint_X ; // 这里的gint_X 是属于当前线程的局部变量, 因为具有thread_local属性, 当此处代码针对gint_X修改时, 不会影响全局gint_X的数值TThread::Synchronize(nullptr, _di_TThreadProcedure([]{gint_X ; // 这里的gint_X 是属于全局变量, 当在Lambda表达式引入gint_X时, thread_local属性已经失效, 当此处代码针对gint_X修改时, 会直接影响全局gint_X的数值}));}} // End g_fun_Thread_Demo()// 创建线程
std::thread Thread1(g_fun_Thread_Demo, LThread #1) ;
[结尾] 通过上面的代码, 可以看出, 真的非常危险, 因为同一个函数内, 对同一个变量gint_X的修改, 会产生两种不同的效果, 也就是说当前函数g_fun_Thread_Demo在多线程中, 引入了gint_X的原变量以及gint_X的原变量的副本.