当前位置:  技术问答>linux和unix

线程专有数据问题,pthread_key_create()

    来源: 互联网  发布时间:2016-05-08

    本文导语:  函数原型如下: int pthread_key_create(pthread_key_t *key, void (*destructor)(void*)); 这个接口好奇怪,在创建key的时候都不知道跟这个key绑定的数据是什么,怎么可以知道用什么destructor? 另外不同的进程绑定的数据不一致怎...

函数原型如下:
int pthread_key_create(pthread_key_t *key, void (*destructor)(void*));

这个接口好奇怪,在创建key的时候都不知道跟这个key绑定的数据是什么,怎么可以知道用什么destructor? 另外不同的进程绑定的数据不一致怎么可以用同一个destructor?

初学多线程,请各位大虾指点

|

看下面的代码。destructor的参数是指针,所以你可以给任何参数。为了区分不同的线程,你可以设计一个结构,其中用tid来区分线程,用type来区分参数类型,根据type的不同来处理具体的data参数。注意,结构里的data也需要malloc和free,或者可以用数组来代替。

csdn贴代码还是不支持google的浏览器,将就看吧:
#include 
#include 
#include 
pthread_key_t   key;

typedef struct _A{
  int tid;
  int type;
  void* data;
}A;

void echomsg(A* a)
{
        printf("destructor excuted in thread %d,param tid=%d, type=%dn",pthread_self(), a->tid, a->type);
        free(a);
}
void * child1(void *arg)
{
        A* a = malloc(sizeof(A));
        a->type = 0;
        int tid=pthread_self();
        a->tid = tid;
        printf("thread %d entern",tid);
        pthread_setspecific(key,(void *)a);
        sleep(2);
        printf("thread %d returns %dn",tid,pthread_getspecific(key));
        sleep(5);
}
void * child2(void *arg)
{
        A* a = malloc(sizeof(A));
        a->type = 1;
        int tid=pthread_self();
        a->tid = tid;
        printf("thread %d entern",tid);
        pthread_setspecific(key,(void *)a);
        sleep(1);
        printf("thread %d returns %dn",tid,pthread_getspecific(key));
        sleep(5);
}
int main(void)
{
        int tid1,tid2;
        printf("hellon");
        pthread_key_create(&key,echomsg);
        pthread_create(&tid1,NULL,child1,NULL);
        pthread_create(&tid2,NULL,child2,NULL);
        sleep(10);
        pthread_key_delete(key);
        printf("main thread exitn");
        return 0;
}


|
man 一段文字贴过来:

An optional destructor function may be associated with each key value. At thread exits, if a key value has a non-NULL destructor pointer, and the thread has a non-NULL value associated with that key, the value of the key is set to NULL, and then the function pointed to is called with the previously associated value as its sole argument. The order of dustructor calls is unspecified if more than one destructor exists for a thread when it exits.


在调用destructor之前, 与key相关的value已经被set成NULL, 那调用destructor的作用是什么? 或者, 调用之后做了什么呢?

如果在pthread_key_create的时候,destructor的位置设置为NULL, 又有什么不同之处呢?

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • c#多线程更新窗口(winform)GUI的数据
  • 子线程的数据如何返回给主线程?
  • 线程函数私有数据的疑问
  • POSIX线程数据共享
  • unix多线程数据传递问题
  • 多线程方位关键数据段(lock,unlock)的问题?????
  • linux多线程数据共享策略问题?
  • 请教:多线程使用同一个socket进行数据收发会出现什么问题?
  • 线程间的通讯问题,关于icq如何发送数据
  • 在数据库应用中,多线程须不需要考虑同步问题,急!谢谢
  • 多线程调用localtime有时得到的数据不正确如何解决
  • 在servlet里访问数据库要不要建线程
  • 如果遇到多层函数调用,使用一次上锁解锁可以保证数据的线程独立性么
  • 请大家讨论,来者有分,java中多个线程之间共享数据的方法都有哪些?
  • 管道线程能够接收数据,然后显示异常:java.io.IOException:write end dead;
  • 由同一个服务端创建两个线程分别向两个客户端同时发送不同的数据···
  • 在线等待:用子线程与ORACLE数据库建立连接的问题。
  • 由于问题变化了,所以重新个贴子,是关于线程间函数调用及串口接收数据的问题?
  • 共享内存及线程数据同步的问题。
  • 同多个线程通过同一个socket发送数据,操作系统底层会同步每个发送操作吗
  • 在main()中调用同一个函数建立多个线程,此函数中定义的数据在多线程中如何使用?
  • Java中多线程相关类Thread介绍
  • 一个进程创建了两个线程,如何使得当任何一个线程(比如线程a)结束时,同时也结束线程b,也就是使两个线程一起死掉,怎么办呢?
  • Windows和Linux下C++类成员方法作为线程函数方法介绍
  • java 线程,对当前线程(非主线程)调用sleep,为什么主线程(窗口)也没反应了
  • c++的boost库多线程(Thread)编程(线程操作,互斥体mutex,条件变量)详解
  • 如何实现一个线程组内多线程的非同不执行,即一个线程执行完毕后再执行下一个线程???
  • Linux下GCC内置原子操作函数(多线程资源访问)介绍
  • 请问:进程创建的线程是怎样运行的啊,线程的处理函数运行完了,线程就退出了吗?
  • 关于线程的问题,什么样的线程不是active线程?
  • 请问Linux核心支持多线程吗?开发库有线程库吗?线程好用吗?(稳定?)


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3