【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 类

相关内容

热门资讯

安卓系统应用数据目录,揭秘系统... 你有没有想过,你的安卓手机里那些应用,它们的数据都藏在哪个角落呢?今天,就让我带你一探究竟,揭开安卓...
kindle 安卓 系统 刷机... 亲爱的读者们,你是不是也和我一样,对电子阅读设备情有独钟?尤其是那款小巧便携的Kindle,简直是阅...
平板 win 安卓 双系统,... 你有没有想过,拥有一台既能运行Windows系统,又能流畅使用安卓应用的多功能平板电脑,是不是能让你...
电脑安卓和苹果系统,电脑操作系... 你有没有发现,现在无论是工作还是娱乐,电脑已经成了我们生活中不可或缺的好伙伴呢!而在这众多电脑中,安...
手机安卓系统下载5.0,引领智... 你有没有发现,最近手机界又掀起了一股热潮?没错,就是安卓系统5.0的下载。这可是安卓家族里的一大亮点...
小森生活系统安卓,打造绿色生态... 你知道吗?最近在手机应用市场上,有个叫做“小森生活系统安卓”的新玩意儿火得一塌糊涂。它就像一个神奇的...
王者荣耀安卓系统更换,畅享全新... 最近是不是发现你的王者荣耀游戏体验有点不对劲?别急,让我来给你揭秘一下安卓系统更换背后的那些事儿!一...
ios系统数据如何导入安卓系统... 你是不是也有过这样的经历:手机里存满了珍贵的照片、视频和联系人,突然有一天,你决定换一台安卓手机,却...
王者荣耀启动安卓系统,畅享指尖... 你知道吗?最近王者荣耀可是大动作连连,竟然宣布要启动安卓系统了!这消息一出,瞬间在游戏圈引起了不小的...
安卓始终显示系统栏,安卓系统栏... 你是不是也遇到了这个问题?手机屏幕上那个讨厌的系统栏,有时候它就像一个顽皮的小鬼,总是赖在你的屏幕上...
苹果系统可以装在安卓,探索跨平... 你知道吗?最近在科技圈里可是掀起了一股热潮呢!那就是——苹果系统竟然可以装在安卓设备上!是不是听起来...
安卓系统双清目的,安卓系统双清... 你知道吗?最近在安卓系统圈子里,有个话题可是热得不得了,那就是“双清”。别小看这个“双清”,它可是关...
安卓系统台电平板,畅享智能生活... 你有没有发现,最近身边的朋友都开始讨论起一款叫做台电的安卓系统平板电脑呢?这可不是随便说说,这款平板...
三菱安卓系统,智能科技与驾驶体... 亲爱的读者,你是否曾好奇过,那些在我们生活中默默无闻的汽车品牌,它们是如何将科技与驾驶体验完美结合的...
安卓系统为什么好,引领智能生活... 你有没有发现,身边的朋友、同事,甚至家人,几乎人手一台安卓手机?这可不是偶然现象哦!安卓系统,这个来...
安卓如何改键盘系统,Andro... 你是不是也和我一样,对安卓手机的键盘系统有点儿不满意?想要换一个更顺手的键盘,但又不知道怎么操作?别...
怎么升级安卓14系统,解锁安卓... 你有没有发现,你的安卓手机最近是不是有点儿慢吞吞的?别急,别急,升级到安卓14系统,让你的手机焕发新...
安卓手机如何系统内录,轻松生成... 你有没有想过,有时候想要记录下手机里的精彩瞬间,却发现没有合适的工具?别急,今天就来教你怎么在安卓手...
最绚丽的安卓系统,最绚丽版本全... 哇,你知道吗?在安卓的世界里,有一款系统,它就像是一颗璀璨的明珠,闪耀着最绚丽的色彩。它就是——最绚...
小米系统安卓通知权限,深度解析... 亲爱的手机控们,你是否曾为手机通知栏里乱糟糟的信息而烦恼?又或者,你是否好奇过,为什么有些应用总是能...