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

相关内容

热门资讯

我来教大家“捕鱼大作战辅助器a... 您好,捕鱼大作战这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏中...
我来教大家“随便字牌辅助器ap... 您好,随便字牌这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏中打...
我来教大家“NGPoKer辅助... 亲,NGPoKer这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,NGPoKer的...
我来教大家“顺兴茶楼辅助器ap... 您好,顺兴茶楼这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏中打...
我来教大家“微乐哈尔滨麻将辅助... 我来教大家“微乐哈尔滨麻将辅助器app官方下载最新版本更新”详细分享开挂1、让任何用户在无需AI插件...
我来教大家“满唐华彩辅助器ap... 亲,满唐华彩这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,满唐华彩的开挂软件,名...
我来教大家“随便玩跑胡子辅助器... 我来教大家“随便玩跑胡子辅助器app官方下载最新版本更新”详细分享开挂1、让任何用户在无需AI插件第...
我来教大家“浙中在线辅助器ap... 您好,浙中在线这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏中打...
我来教大家“闲逸互娱辅助器ap... 您好,闲逸互娱这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏中打...
我来教大家“和和全集辅助器ap... 亲,和和全集这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,和和全集的开挂软件,名...
我来教大家“满天星辅助器app... 您好,满天星这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏中打牌...
我来教大家“豆芽娱乐辅助器ap... 我来教大家“豆芽娱乐辅助器app官方下载最新版本更新”详细分享开挂1、让任何用户在无需AI插件第三方...
我来教大家“斗棋恩施麻将辅助器... 亲,斗棋恩施麻将这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,斗棋恩施麻将的开挂...
我来教大家“一道棋牌辅助器ap... 我来教大家“一道棋牌辅助器app官方下载最新版本更新”详细分享开挂1、让任何用户在无需AI插件第三方...
电视安卓系统哪个品牌好,哪家品... 你有没有想过,家里的电视是不是该升级换代了呢?现在市面上电视品牌琳琅满目,各种操作系统也是让人眼花缭...
安卓会员管理系统怎么用,提升服... 你有没有想过,手机里那些你爱不释手的APP,背后其实有个强大的会员管理系统在默默支持呢?没错,就是那...
安卓系统软件使用技巧,解锁软件... 你有没有发现,用安卓手机的时候,总有一些小技巧能让你玩得更溜?别小看了这些小细节,它们可是能让你的手...
安卓系统提示音替换 你知道吗?手机里那个时不时响起的提示音,有时候真的能让人心情大好,有时候又让人抓狂不已。今天,就让我...
安卓开机不了系统更新 手机突然开不了机,系统更新还卡在那里,这可真是让人头疼的问题啊!你是不是也遇到了这种情况?别急,今天...
安卓系统中微信视频,安卓系统下... 你有没有发现,现在用手机聊天,视频通话简直成了标配!尤其是咱们安卓系统的小伙伴们,微信视频功能更是用...