Linux下的多线程编程(三)完整攻略
1. pthread_join函数
pthread_join函数主要用于等待一个线程结束,并获取它的退出状态。函数的原型为:
int pthread_join(pthread_t thread, void **retval);
其中,第一个参数thread是要等待的线程ID,如果值为零,则等待任何一个线程。第二个参数retval是用来存储线程退出状态的,它是一个指向指针的指针类型,如果不关心线程退出状态,可以将此参数设为NULL。
函数返回值为0表示成功,非0表示失败。
下面的示例展示了如何使用pthread_join函数。
#include <pthread.h>
#include <stdio.h>
void *thread_func(void *arg)
{
int val = *((int*)arg);
printf("thread_func: arg=%d\n", val);
pthread_exit((void*)val);
}
int main()
{
pthread_t thread;
int arg = 123;
void *retval;
pthread_create(&thread, NULL, thread_func, &arg);
pthread_join(thread, &retval);
printf("main: thread exited with %d\n", (int)retval);
return 0;
}
在上面的示例中,我们创建了一个线程并传递了一个整数值作为参数。线程执行函数将会获取这个参数并打印。主线程使用pthread_join函数等待线程结束并获取线程退出状态,然后打印出来。
2. 线程的局部数据
除了线程共享的全局数据和堆内存,线程还可以拥有自己的局部数据。这些数据只能被拥有它的线程访问和修改。每个线程的局部数据独立于其他线程的局部数据,也就是说,它们不共享内存。
线程的局部数据通过pthread_key_create、pthread_key_delete和pthread_getspecific、pthread_setspecific等函数来进行操作。
下面的示例展示了如何使用pthread_key_create、pthread_key_delete和pthread_setspecific函数来创建、销毁、设置和获取线程的局部数据。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
pthread_key_t key;
void dest(void *value)
{
printf("dest: value=%p\n", value);
free(value);
}
void *thread_func(void *args)
{
int *value = malloc(sizeof(int));
*value = *((int*)args);
pthread_setspecific(key, value);
printf("thread_func: value=%p\n", value);
return NULL;
}
int main()
{
pthread_t thread1, thread2;
int arg1 = 123, arg2 = 456;
pthread_key_create(&key, dest);
pthread_create(&thread1, NULL, thread_func, &arg1);
pthread_create(&thread2, NULL, thread_func, &arg2);
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
pthread_key_delete(key);
return 0;
}
在上面的示例中,我们使用pthread_key_create函数创建了一个线程局部数据key,使用pthread_setspecific函数设置了key的值。线程执行函数中的局部变量value分别被设置了不同的值,并打印。在主线程中,我们调用pthread_join等待两个线程结束后,使用pthread_key_delete函数销毁key。注意:在销毁线程局部数据之前,必须确保所有拥有它的线程已经退出。这是因为在线程结束后,key会自动被系统销毁。
结语
本文介绍了pthread_join函数和线程的局部数据,并通过示例说明了它们的使用方法。掌握了这些技术,我们在实际开发中能更好的利用Linux多线程编程的优势,提高程序性能和稳定性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Linux下的多线程编程(三) - Python技术站