Linux多线程编程中引入了Thread-Specific Data(线程相关的数据)的概念
为什么需要"线程相关的数据"呢?怎样使用"线程相关的数据"呢?
1. 为什么需要Thread-Specific Data "线程相关的数据"
例子:实现同时运行两个线程,对于每个线程,在该线程调用的每个函数中打印线程的名字,以及它正在调用的函数的名字.
不使用"线程相关的数据"的两种实现方法:
实现方法1. 不使用全局变量
#include
#include
#defineMAXLENGTH 20
voidanother_func (constchar*threadName)
{
printf("%s is running in another_func/n",threadName)
}
void*thread_func (void*args)
{
charthreadName[MAXLENGTH]
strncpy(threadName,(char*)args,MAXLENGTH-1)
printf("%s is running in thread_func/n",threadName)
another_func (threadName)
}
intmain (intargc,char*argv[])
{
pthread_tpa,pb
pthread_create(&pa,NULL,thread_func,"Thread A")
pthread_create(&pb,NULL,thread_func,"Thread B")
pthread_join(pa,NULL)
pthread_join(pb,NULL)
}
输出结果为:
Thread A is running in thread_func
Thread A is running in another_func
Thread B is running in thread_func
Thread B is running in another_func
该方法的缺点是:由于要记录是哪一个线程在调用函数,每个函数需要一个额外的参数来
记录线程的名字,例如another_func函数需要一个threadName参数
如果调用的函数多了,则每一个都需要一个这样的参数实现方法2. 使用全局变量
#include
#include
#defineMAXLENGTH 20
charthreadName[MAXLENGTH]
pthread_mutex_tsharedMutex=PTHREAD_MUTEX_INITIALIZER
voidanother_func ()
{
printf("%s is running in another_func/n",threadName)
}
void*thread_func (void*args)
{
pthread_mutex_lock(&sharedMutex)
strncpy(threadName,(char*)args,MAXLENGTH-1)
printf("%s is running in thread_func/n",threadName)
another_func ()
pthread_mutex_unlock(&sharedMutex)
}
intmain (intargc,char*argv[])
{
pthread_tpa,pb
pthread_create(&pa,NULL,thread_func,"Thread A")
pthread_create(&pb,NULL,thread_func,"Thread B")
pthread_join(pa,NULL)
pthread_join(pb,NULL)
}
该方法的缺点是:由于多个线程需要读写全局变量threadName,就需要使用互斥机制
分析以上两种实现方法,Thread-Specific Data "线程相关的数据"的一个好处就体现出来了:
(1)"线程相关的数据"可以是一个全局变量,并且
(2)每个线程存取的"线程相关的数据"是相互独立的.
2. 怎样使用"线程相关的数据"这是利用"线程相关的数据"的实现方式:
#include
#include
pthread_key_tp_key
voidanother_func ()
{
printf("%s is running in another_func/n",(char*)pthread_getspecific(p_key))
}
void*thread_func (void*args)
{
pthread_setspecific(p_key,args)
printf("%s is running in thread_func/n",(char*)pthread_getspecific(p_key))
another_func ()
}
intmain (intargc,char*argv[])
{
pthread_tpa,pb
pthread_key_create(&p_key,NULL)
pthread_create(&pa,NULL,thread_func,"Thread A")
pthread_create(&pb,NULL,thread_func,"Thread B")
pthread_join(pa,NULL)
pthread_join(pb,NULL)
}
说明:
(1)
线程A, B共用了p_key,
通过p_key,就可以存取只跟当前线程相关的一个值(这个值由编译器管理)
线程A----->p_key----->线程A相关的值(由编译器管理)
线程B----->p_key----->线程B相关的值(由编译器管理)
设置"线程相关的数据",使用
int pthread_setspecific(pthread_key_t key, const void *pointer);
读取"线程相关的数据",使用
void * pthread_getspecific(pthread_key_t key);
注意到,这两个函数分别有一个void类型的指针,我们的线程就是通过这两个指针分别与
"线程相关的数据"的数据进行交互的
(2)
分享到:
相关推荐
Java-Thread-Affinity:将Java线程绑定到给定的内核
线程调用类对象 在前面的示例中,我们为线程任务使用了通常的函数。实际上,我们可以使用任何可调用对象或者lambda函数,如下调用类对象的例子: #include #include <thread> class MyFunctor { public: void ...
worker-thread-object:辅助线程对象,TypeScript
一、多线程共享全局变量 首先我们来回忆下在函数中修改全局变量的情况。 在一个函数中,对全局变量进行修改的时候,到底是否需要使用 global 进行说明,要看是否对全局变量的执行指向进行了修改。 如果修改了执行...
ForkJoinPool-thread-leak ForkJoinPool 线程泄漏 我的输出: Iteration 0: 3 threads Iteration 111: 118 threads Iteration 222: 229 threads Iteration 333: 340 threads Iteration 444: 451 threads ...
这是一个用于跟踪线程创建和Thread.start()调用的简单插件。 要使用简单地使用ThreadInterceptor.registerThreadInterceptor注册您的ThreadCallInterceptor实现。 并将库添加到 JVM 启动(显示的是 Oracle 和 ...
thread 源码 java java-multi-thread-programming java多线程编程核心技术源码
用于更新 reddit 自线程的可写流。 npm install reddit-thread-stream 用法 构造函数接受凭据作为第一个参数,或者一个选项映射,用于创建一个新的自线程,或者一个现有线程的 id(或全名)。 使用reddit....
--thread-count : 用户线程数 --jvm-options : JVM 选项,通常是JAVA_OPTS --head-room : 可用总内存的百分比,将保留未分配以覆盖 JVM 开销 内存计算器打印计算出的 JVM 配置标志(不包括用户在--jvm-options指定...
Java-Thread-Affinity,将Java线程绑定到给定的内核.zip
Real-Time EmbeddedMultithreading:Using ThreadX and ARM
系统软件设计平台采用RT-Thread实时操作系统 当前拥有的线程: LED线程:系统指示灯,定时翻转,用于指示系统没有死机。 PWM线程:电机驱动,用于电机控速,并导出命令,通过finsh命令行的方式,设置PWM占空比。
关于这个脚本在 GDB 无法正确读取prctl(PR_SET_NAME, ...)和类似方法的情况下,此脚本可用于在 GDB 中通过从/proc中提取线程名称来设置线程名称。要求使用--with-python编译的(最近)版本的 GDB。安装要安装此脚本...
如果任意一个线程调用了exit或_exit,则整个进程的所有线程都终止,由于从main函数return也相当于调用exit,为了防止新创建的线程还没有得到执行就终止,我们在main函数return之前延时1秒,这只是一种权宜之计,即使...
该文件中实例说明了如何在Labwindows/cvi中使用线程锁和线程安全变量进行多线程程序设计
:gear: thread-fetcher.js是一个小脚本(~4,0kB),它允许你在一个单独的线程中以编程方式获取任何类型的资源,让主线程可以自由地“专注于”动画和其他视觉上明显的变化,以提高感知性能给最终用户。 Loader 可以...
from threading import Thread global_num = 0 def func1(): global global_num for i in range(1000000): global_num += 1 print('---------func1:global_num=%s--------'%global_num) def func2(): global ...
1.Python 的 threading.Thread 类有一个 run 方法,用于定义线程的功能函数,可以在自 己的线程类(继承 threading.thread 类)中覆盖该方法。 2.Python 中的多线程共享全局变量,很方便在多个线程间共享数据 3.多...
人工智能-项目实践-多线程-tonado的multi-thread 多线程封装 Quick Start 1.在“biz”目录中创建一个py文件,文件名任意但最好不要跟第三方库冲突 2.使用 "Router.route" 装饰器注册函数到路由表中,仿造示例即可 ...
android-sample-simple-thread-app 简单的Android线程用法示例