在本篇文章当中主要给大家介绍线程最基本的组成元素,以及在 pthread 当中给我们提供的一些线程的基本机制,因为很多语言的线程机制就是建立在 pthread 线程之上的,比如说 Python 和 Java,深入理解 pthread 的线程实现机制,可以极大的提升我们对于语言线程的认识。希望能够帮助大家深入理解线程。
首先我们需要了解一些我们在使用线程的时候的常用的基本操作,如果不是很了解没有关系我们在后续的文章当中会仔细谈论这些问题。
线程的常见的基本操作:
在 linux 当中所有的线程和进程共享一个地址空间。
进程与线程之间共享一些内核数据结构:
线程独有的:
在所有的 pthread 的接口当中,只有当函数的返回值是 0 的时候表示调用成功。
在 pthread 的实现当中,每个线程都两个特性:joinable 和 detached,当我们启动一个线程的时候 (pthread_create) 线程的默认属性是 joinable,所谓 joinable 是表示线程是可以使用 pthread_join 进行同步的。
当一个线程调用 pthread_join(T, ret),当这个函数返回的时候就表示线程 T 已经终止了,执行完成。那么就可以释放与线程 T 的相关的系统资源。
如果一个线程的状态是 detached 状态的话,当线程结束的时候与这个线程相关的资源会被自动释放掉,将资源归还给系统,也就不需要其他的线程调用 pthread_join 来释放线程的资源。
pthread_join 函数签名如下:
int pthread_join(pthread_t thread, void **retval); |
在下面的程序当中我们使用 pthread_join 函数去等待一个 detached 线程:
#include <stdio.h> |
|
#include <error.h> |
|
#include <errno.h> |
|
#include <pthread.h> |
|
#include <unistd.h> |
|
pthread_t t1, t2; |
|
void* thread_1(void* arg) { |
|
int ret = pthread_detach(pthread_self()); |
|
sleep(2); |
|
if(ret != 0) |
|
perror(""); |
|
return NULL; |
|
} |
|
int main() { |
|
pthread_create(&t1, NULL, thread_1, NULL); |
|
sleep(1); |
|
int ret = pthread_join(t1, NULL); |
|
if(ret == ESRCH) |
|
printf("No thread with the ID thread could be found.\n"); |
|
else if(ret == EINVAL) { |
|
printf("thread is not a joinable thread or Another thread is already waiting to join with this thread\n"); |
|
} |
|
return 0; |
|
} |
|
上面的程序的输出结果如下所示:
$ ./join.out |
|
thread is not a joinable thread or Another thread is already waiting to join with this thread |
在上面的程序当中我们在一个 detached 状态的线程上使用 pthread_join 函数,因此函数的返回值是 EINVAL 表示线程不是一个 joinable 的线程。
在上面的程序当中 pthread_self() 返回当前正在执行的线程,返回的数据类型是 pthread_t ,函数 pthread_detach(thread) 的主要作用是将传入的线程 thread 的状态变成 detached 状态。
标签:Pthread,编程,机制,使用,程序,创建,java,icode9 来源:
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。