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

相关内容

热门资讯

电脑系统桌面:我的情感投射与心... 大家好,我是你们的朋友小桌,今天我想和大家聊聊我的小世界——电脑系统桌面。这不仅仅是一个冷冰冰的屏幕...
mac os x lion主题... 哎呀,说到MacOSXLion,我的心情真是五味杂陈啊!记得第一次看到它那狮子头标志,我还以为苹果的...
冠心病病例书写-冠心病令人心塞... 哎,说起这冠心病啊,真是让人心塞。我这胸口时不时就像被个大石头压着,喘气都费劲。那天夜里,突然一阵剧...
考勤机管理员初始密码-考勤机初... 哟,今天咱们聊聊那个让人又爱又恨的小东西——考勤机!特别是那个让人头疼的初始密码,哎,真是让人哭笑不...
呼吸道合胞病毒/药物作用-呼吸... 哎呀,说到这个呼吸道合胞病毒,真是让人头疼!它就像个调皮的小鬼,悄无声息地潜入我们的身体,搞得我们咳...
多用户商城系统开发-打造令人眼... 嘿,朋友们,今天咱们聊聊怎么搞那个让人眼花缭乱的多用户商城系统,这可不是小事,得整得漂漂亮亮的,让每...
对外分销服务贸易-分销服务贸易... 大家好,我是小张,一个在分销服务贸易行业里摸爬滚打多年的“老油条”。今天,我想和大家聊聊这个让世界变...
欧派木门凡蒂尼:精致设计,耐用... 哎呀,说到欧派木门凡蒂尼,我这心里就满满的温暖和安全感。你知道吗?每次我一推开那扇门,就像是走进了一...
乐至新闻砍人-乐至砍人事件震惊... 今天,我听到了一个让我心都碎了的消息,乐至发生了一件让人难以置信的事情。就在我们平静的小城里,竟然发...
gps定位系统发展-GPS 定... 嘿,朋友们,今天咱们聊聊那个让我们告别“我在哪儿”的神奇玩意儿——GPS定位系统!想当年,没有这玩意...
梦幻西游手游全部版本-梦幻西游... 哎呀,说到梦幻西游手游,我的心就扑通扑通跳个不停!这款游戏,简直就是我们这一代人的青春记忆啊!从最早...
北京市朝阳区大屯医院-大屯医院... 哎呀,说到咱们大屯医院,我的心头就涌上一股暖流。这地方,可真是个宝藏!你知道吗,每次我有点小病小痛的...
csrss.exe下载-重要提... 哎呀,说到这个csrss.exe,我得先说,这可不是什么随便下载的小玩意儿!你可能在电脑的任务管理器...
路口女交警-女交警:城市交通中... 在繁忙的城市交通中,有那么一群人,她们以女性的柔美和警察的刚毅,成为了路口的一道独特风景。她们就是路...
easyrecover官网-数... 嘿,你知道吗?在这个数字化的世界里,我们的数据就像是我们的小宝贝一样宝贵。但有时候,不管是因为手滑误...
php 快速排序和冒泡排序 区... 嘿,大家好!今天咱们聊聊PHP里的两位排序大佬——快速排序和冒泡排序。这俩家伙,一个像是风驰电掣的赛...
extreme car碎片都在... 嘿,伙计们,今天咱们聊聊那些极速狂飙后的残骸——赛车碎片!你以为那只是一场速度与激情的游戏?错了,那...
怎样查看路口监控-监控摄像头:... 哟,大家好!今天咱们就来聊聊那些路口的小眼睛——监控摄像头。你是不是也和我一样,有时候好奇心爆棚,想...
达思数据库恢复软件:拯救电脑数... 我们的电脑里塞满了珍贵的记忆和重要的工作文件。但,天有不测风云,硬盘也有悲欢离合。当你面对那突如其来...
百会crm 价格-百会 CRM... 哎呀,说到百会CRM的价格,我这心里就五味杂陈的。你知道吗,作为一个小企业主,我每天都在算着每一分钱...