线程特定的存储器
2016-04-20 13:02
169 查看
线程特定的存储器设计模式允许多线程使用一个“逻辑上全局的访问点”获取一个局限于某一个线程的对象,而不会导致对象访问中的加锁开销。
例如,多线程访问全局errno变量,会导致加锁同步开销。
解决方案:为每个具体线程的对象引入一个全局访问点,但是在每个线程的存储器中保存“真实”的对象。应用程序仅通过它们的全局访问点管理这些线程特定对象。
该模式有六个参与者组成。
1.线程特定对象是一个只能有特定线程访问的对象实例。
2.关键字工厂分配关键字来标识一个线程特定对象。
3.线程特定对象集包含与特定线程关联的线程特定对象的集合。
4.线程特定对象代理,使客户机像访问普通对象一样访问一个特定类型的线程特定对象。
5.应用程序线程。
类图:
时序图
代码示例:
运行结果:
该模式优点:
1.高效。去除加速解锁的开销。
2.可重用行。线程特定存储器模式代码可以与具体的应用程序类相分离,可以使开发者避免考虑复杂并且不可移植的线程相关逻辑。
3.易用性。理解简单,结构清晰,方便使用。
4.可移植性。
缺点:
1.它鼓励对(线程特定的)全局对象的使用。
2.它使系统结构变得模糊。
3.它限制了实现方式的选择。不是所有语言都支持参数类型和只能指针,并非所有的应用程序都提供扩展接口。
例如,多线程访问全局errno变量,会导致加锁同步开销。
解决方案:为每个具体线程的对象引入一个全局访问点,但是在每个线程的存储器中保存“真实”的对象。应用程序仅通过它们的全局访问点管理这些线程特定对象。
该模式有六个参与者组成。
1.线程特定对象是一个只能有特定线程访问的对象实例。
2.关键字工厂分配关键字来标识一个线程特定对象。
3.线程特定对象集包含与特定线程关联的线程特定对象的集合。
4.线程特定对象代理,使客户机像访问普通对象一样访问一个特定类型的线程特定对象。
5.应用程序线程。
类图:
时序图
代码示例:
#include <pthread.h> #include <stdlib.h> #include <stdint.h> #include <stdio.h> pthread_key_t errno_location; pthread_once_t errno_init; void destruct_errno(void* ptr) { free(ptr); } void init_errno(void) { pthread_key_create(&errno_location, destruct_errno); } int32_t* get_errno_location(void) { void* ptr; (void)pthread_once(&errno_init, init_errno); ptr = pthread_getspecific(errno_location); if (!ptr) { ptr = calloc(1, sizeof(int32_t)); pthread_setspecific(errno_location, ptr); } return (int32_t*)ptr; } void* thread_function (void* args) { int32_t *erro = (int32_t*)get_errno_location(); printf("erro:%d\n",*erro); *erro = pthread_self(); int* perro =get_errno_location(); printf("pthread_self:%d, erro:%d\n",pthread_self(), *perro); } int main () { int i = 0; pthread_t threads[5]; for (i = 0; i < 5; ++i) { pthread_create (&(threads[i]), NULL, thread_function, NULL); } for (i = 0; i < 5; ++i) { pthread_join (threads[i], NULL); } return 0; }
运行结果:
该模式优点:
1.高效。去除加速解锁的开销。
2.可重用行。线程特定存储器模式代码可以与具体的应用程序类相分离,可以使开发者避免考虑复杂并且不可移植的线程相关逻辑。
3.易用性。理解简单,结构清晰,方便使用。
4.可移植性。
缺点:
1.它鼓励对(线程特定的)全局对象的使用。
2.它使系统结构变得模糊。
3.它限制了实现方式的选择。不是所有语言都支持参数类型和只能指针,并非所有的应用程序都提供扩展接口。
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- Ruby设计模式编程之适配器模式实战攻略
- 实例讲解Ruby使用设计模式中的装饰器模式的方法
- 设计模式中的模板方法模式在Ruby中的应用实例两则
- Ruby设计模式编程中对外观模式的应用实例分析
- 实例解析Ruby设计模式编程中Strategy策略模式的使用
- Ruby中使用设计模式中的简单工厂模式和工厂方法模式
- Ruby使用设计模式中的代理模式与装饰模式的代码实例
- 详解组合模式的结构及其在Ruby设计模式编程中的运用
- C#编程中使用设计模式中的原型模式的实例讲解
- 使用设计模式中的工厂方法模式进行C#编程的示例讲解
- 实例解析C#设计模式编程中简单工厂模式的使用
- 详解C#设计模式编程中生成器模式的使用
- 深入解析C#设计模式编程中对建造者模式的运用