pthread_getpecific和pthread_setspecific

pthread_getpecific和pthread_setspecific实现同一个线程中不同函数间共享数据的一种很好的方式。

 

#more test.c

/*

 * =====================================================================================

 *       Filename:  thead.c

 *    Description:  getspecific

 *        Created:  05/10/2011 12:09:43 AM

 * =====================================================================================

 */

#include<stdio.h>

#include<pthread.h>

#include<string.h>

pthread_key_t p_key;

 

void func1()

{

        int *tmp = (int*)pthread_getspecific(p_key);//同一线程内的各个函数间共享数据。

        printf("%d is runing in %s\n",*tmp,__func__);

 

}

void *thread_func(void *args)

{

 

        pthread_setspecific(p_key,args);

 

        int *tmp = (int*)pthread_getspecific(p_key);//获得线程的私有空间

        printf("%d is runing in %s\n",*tmp,__func__);

 

        *tmp = (*tmp)*100;//修改私有变量的值

 

        func1();

 

        return (void*)0;

}

int main()

{

        pthread_t pa, pb;

        int a=1;

        int b=2;

        pthread_key_create(&p_key,NULL);

        pthread_create(&pa, NULL,thread_func,&a);

        pthread_create(&pb, NULL,thread_func,&b);

        pthread_join(pa, NULL);

        pthread_join(pb, NULL);

        return 0;

}

 

#gcc -lpthread  test.c -o test

# ./test 

2 is runing in thread_func

1 is runing in thread_func

100 is runing in func1

200 is runing in func1

pthread_setspecific函数用于将特定于线程的数据(Thread-specific data)存储在线程的指定键值(key)中。在多线程环境下,每个线程都可以拥有自己独立的数据副本,互不干扰,从而实现线程间数据隔离。 函数声明如下: ```c int pthread_setspecific(pthread_key_t key, const void *value); ``` 其中,`key`是线程特定数据的键值,`value`是要存储的数据指针。 使用该函数步骤如下: 1. 在主线程中调用 `pthread_key_create` 函数创建键值 `key`。 2. 在子线程中调用 `pthread_setspecific` 函数,将线程特定数据存储在键值 `key` 中。 3. 在子线程中需要使用线程特定数据时,调用 `pthread_getspecific` 函数获取数据。 下面是一个简单的示例: ```c #include <stdio.h> #include <stdlib.h> #include <pthread.h> pthread_key_t key; // 定义线程特定数据的键值 void* thread_func(void* arg) { int* value = (int*)malloc(sizeof(int)); *value = (int)arg; pthread_setspecific(key, value); // 将线程特定数据存储在key对应的键值中 printf("Thread %d: value=%d\n", (int)arg, *value); return NULL; } int main() { int i; pthread_key_create(&key, NULL); // 创建线程特定数据的键值 pthread_t threads[5]; for (i = 0; i < 5; i++) { pthread_create(&threads[i], NULL, thread_func, (void*)i); } for (i = 0; i < 5; i++) { pthread_join(threads[i], NULL); } return 0; } ``` 在该示例中,主线程中先通过 `pthread_key_create` 函数创建了线程特定数据的键值 `key`。然后创建了5个子线程,在每个子线程中调用 `pthread_setspecific` 函数将线程编号存储在 `key` 对应的键值中。最后,主线程等待所有子线程结束后退出。 运行该示例,输出结果如下: ``` Thread 0: value=0 Thread 1: value=1 Thread 2: value=2 Thread 3: value=3 Thread 4: value=4 ``` 可以看到,每个子线程输出的 `value` 值都不同,说明每个线程都成功地将自己的线程编号存储在了 `key` 对应的键值中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值