How do I create a global variable that is thread-specific in C using POSIX threads?

后端 未结 3 770
[愿得一人]
[愿得一人] 2021-01-31 21:32

I am learning about POSIX threads and I have come to the section on Thread Specific Data. The book does an excellent example using a file descriptor. However, I wanted to do the

3条回答
  •  温柔的废话
    2021-01-31 21:58

    The purpose of TLS (thread-local storage) is to provide an defined mechanism whereby code can retrieve thread-specific data stored in a database accessed by a all-threads-known shared key. Your code is storing the same data in TLS: the address of a single global variable). Therefore when a thread requests this data using the tls-key, they will all get back the same address.

    I think you intend your code to do something like this:

    #include 
    #include 
    #include 
    
    #define NUMTHREADS 4
    
    pthread_key_t glob_var_key;
    
    void do_something()
    {
        //get thread specific data
        int* glob_spec_var = pthread_getspecific(glob_var_key);
        printf("Thread %d before mod value is %d\n", (unsigned int) pthread_self(), *glob_spec_var);
        *glob_spec_var += 1;
        printf("Thread %d after mod value is %d\n", (unsigned int) pthread_self(), *glob_spec_var);
    }
    
    void* thread_func(void *arg)
    {
        int *p = malloc(sizeof(int));
        *p = 1;
        pthread_setspecific(glob_var_key, p);
        do_something();
        do_something();
        pthread_setspecific(glob_var_key, NULL);
        free(p);
        pthread_exit(NULL);
    }
    
    int main(void)
    {
        pthread_t threads[NUMTHREADS];
        int i;
    
        pthread_key_create(&glob_var_key,NULL);
        for (i=0; i < NUMTHREADS; i++)
            pthread_create(threads+i,NULL,thread_func,NULL);
    
        for (i=0; i < NUMTHREADS; i++)
            pthread_join(threads[i], NULL);
    
        return 0;
    }
    

    Output

    Thread 2625536 before mod value is 1
    Thread 741376 before mod value is 1
    Thread 3162112 before mod value is 1
    Thread 3698688 before mod value is 1
    Thread 2625536 after mod value is 2
    Thread 741376 after mod value is 2
    Thread 3162112 after mod value is 2
    Thread 3698688 after mod value is 2
    Thread 2625536 before mod value is 2
    Thread 741376 before mod value is 2
    Thread 3162112 before mod value is 2
    Thread 3698688 before mod value is 2
    Thread 2625536 after mod value is 3
    Thread 741376 after mod value is 3
    Thread 3162112 after mod value is 3
    Thread 3698688 after mod value is 3
    

提交回复
热议问题