【BOOST C++ 13 并行编程】(3) 线程本地存储
admin
2024-01-28 02:45:30
0

一、线程本地存储

        线程本地存储 (TLS) 是一个只能由一个线程访问的专用存储区域。 TLS 变量可以看作是全局变量,只对特定线程可见,对整个程序不可见。

二、库调用代码

        示例 44.12。使用静态变量同步多个线程

#include 
#include boost::mutex mutex;void init()
{static bool done = false;boost::lock_guard lock{mutex};if (!done){done = true;std::cout << "done" << '\n';}
}void thread()
{init();init();
}int main()
{boost::thread t[3];for (int i = 0; i < 3; ++i)t[i] = boost::thread{thread};for (int i = 0; i < 3; ++i)t[i].join();
}

Example 44.12

        示例 44.12 在三个线程中执行函数 thread()。 thread() 调用另一个函数 init() 两次,init() 检查布尔变量 done 是否为 false。如果是,则变量设置为 true 并将 done 写入标准输出。

        done 是所有线程共享的静态变量。如果第一个线程将 done 设置为 true,则第二个和第三个线程不会将 done 写入标准输出。在任何线程中第二次调用 init() 也不会将完成写入标准输出。该示例将打印完成一次。

        像 done 这样的静态变量可用于在进程中进行一次性初始化。要对每个线程进行一次性初始化,可以使用 TLS。

        示例 44.13。使用 TLS 同步多个线程

#include 
#include boost::mutex mutex;void init()
{static boost::thread_specific_ptr tls;if (!tls.get()){tls.reset(new bool{true});boost::lock_guard lock{mutex};std::cout << "done" << '\n';}
}void thread()
{init();init();
}int main()
{boost::thread t[3];for (int i = 0; i < 3; ++i)t[i] = boost::thread{thread};for (int i = 0; i < 3; ++i)t[i].join();
}

        在示例 44.13 中,静态变量 done 已替换为 TLS 变量 tls,它基于类模板 boost::thread_specific_ptr – 用类型 bool 实例化。原则上,tls 的工作方式与 done 类似:它充当指示某事是否已经完成的条件。然而,关键区别在于 tls 存储的值仅对相应的线程可见和可用。

        一旦创建了 boost::thread_specific_ptr 类型的变量,就可以对其进行设置。此变量需要 bool 类型变量的地址,而不是变量本身。使用 reset() 成员函数,地址可以存储在 tls 中。在示例 44.13 中,一个 bool 类型的变量是动态分配的,它的地址由 new 返回,存储在 tls 中。为避免每次调用 init() 时都设置 tls,成员函数 get() 用于检查地址是否已存储。

        因为 boost::thread_specific_ptr 存储了一个地址,所以这个类的行为就像一个指针。例如,它提供了成员函数 operator* 和 operator->,它们的工作方式与您希望它们与指针一起工作的方式相同。

Example 44.13

        示例 44.13 将 done 打印到标准输出 3 次。每个线程在第一次调用 init() 时打印完成。因为使用了 TLS 变量,所以每个线程都使用自己的变量 tls。当第一个线程使用指向动态分配的布尔变量的指针初始化 tls 时,第二个和第三个线程中的 tls 变量仍未初始化。由于 TLS 变量是每个线程的全局变量,而不是每个进程的全局变量,因此在一个线程中使用 tls 不会更改任何其他线程中的变量。

上一篇:MATLAB switch语句

下一篇:kotlin 类

相关内容

热门资讯

安卓系统用的华为应用,探索智能... 你知道吗?在安卓系统里,华为的应用可是个宝库呢!它们不仅功能强大,而且使用起来超级方便。今天,就让我...
安卓变ios系统魅蓝 你知道吗?最近有个朋友突然告诉我,他要把自己的安卓手机换成iOS系统,而且还是魅蓝品牌的!这可真是让...
幻书启世录安卓系统,安卓世界中... 亲爱的读者们,你是否曾在某个夜晚,被一本神奇的书所吸引,仿佛它拥有着穿越时空的力量?今天,我要带你走...
电脑安装安卓系统进不去,安卓系... 电脑安装安卓系统后竟然进不去,这可真是让人头疼的问题啊!你是不是也遇到了这种情况,心里直呼“怎么办怎...
用键盘切换控制安卓系统,畅享安... 你有没有想过,用键盘来控制你的安卓手机?是的,你没听错,就是那个我们每天敲敲打打的小玩意儿——键盘。...
小米安卓镜像系统在哪,小米安卓... 你有没有想过,你的小米手机里有一个隐藏的宝藏——安卓镜像系统?没错,就是那个可以让你的手机瞬间变身成...
安卓手机下载排班系统,高效排班... 你有没有想过,每天忙碌的工作中,有没有什么好帮手能帮你轻松管理时间呢?今天,就让我来给你介绍一个超级...
桌面组件如何弄安卓系统,桌面组... 亲爱的桌面爱好者们,你是否曾梦想过将安卓系统搬到你的电脑桌面上?想象那些流畅的动画、丰富的应用,还有...
安卓13系统介绍视频,新功能与... 亲爱的读者们,你是否对安卓13系统充满好奇?想要一探究竟,却又苦于没有足够的时间去研究?别担心,今天...
车机安卓7.1系统,功能升级与... 你有没有发现,现在的车机系统越来越智能了?尤其是那些搭载了安卓7.1系统的车机,简直就像是个贴心的智...
安卓系统下如何读pdf,And... 你有没有遇到过这种情况:手机里存了一大堆PDF文件,可是怎么也找不到一个能顺畅阅读的工具?别急,今天...
安卓系统全国通用的吗,畅享智能... 你有没有想过,为什么你的手机里装的是安卓系统呢?安卓系统,这个名字听起来是不是有点神秘?今天,就让我...
假苹果手机8安卓系统,颠覆传统... 你有没有想过,如果苹果手机突然变成了安卓系统,会是怎样的景象呢?想象那熟悉的苹果外观,却运行着安卓的...
安卓12.0系统vivo有吗,... 你有没有听说最近安卓系统又升级啦?没错,就是那个让手机焕然一新的安卓12.0系统!那么,咱们国内的手...
核心芯片和安卓系统,探索核心芯... 你知道吗?在科技的世界里,有一对“黄金搭档”正悄悄改变着我们的生活。他们就是——核心芯片和安卓系统。...
如何调安卓系统屏幕颜色,安卓系... 亲爱的手机控们,你是否曾觉得安卓系统的屏幕颜色不够个性,或者是因为长时间盯着屏幕而感到眼睛疲劳?别担...
旧台式电脑安装安卓系统,轻松安... 你那台旧台式电脑是不是已经服役多年,性能逐渐力不从心,却又不忍心让它退役呢?别急,今天就来教你怎么给...
美国要求关闭安卓系统,科技霸权... 美国要求关闭安卓系统:一场技术革新还是政治博弈?在数字化时代,智能手机已经成为我们生活中不可或缺的一...
安卓系统日记本 你有没有发现,手机里的安卓系统日记本,简直就是记录生活点滴的宝藏库呢?想象每天忙碌的生活中,有没有那...
安卓手机广告最少的系统,探索安... 你有没有发现,用安卓手机的时候,广告总是无处不在,让人烦得要命?不过别急,今天我要给你揭秘一个秘密—...