linux多线程服务器编程(全方面了解linux多线程服务)(3/13)

来源:国外服务器 在您之前已被浏览:1 次
导读:目前正在解读《linux多线程服务器编程(全方面了解linux多线程服务)(3/13)》的相关信息,《linux多线程服务器编程(全方面了解linux多线程服务)(3/13)》是由用户自行发布的知识型内容!下面请观看由(国外主机 - www.2bp.net)用户发布《linux多线程服务器编程(全方面了解linux多线程服务)(3/13)》的详细说明。
笨笨网美国主机,w ww.2 b p .n e t

1、入口函数的return返回,线程就退出了

2、线程调用pthread_exit(NULL),谁调用谁退出

#include

void pthread_exit(void *retval);

参数:retval是返回信息,”临终遗言“,可以给可以不给

该变量不能使用临时变量。

可使用:全局变量、堆上开辟的空间、字符串常量。

pthread_exit和线程启动函数(start_routine) 执行return是有区别的。 在start_routine中调用的任何层级的函数执行pthread_exit() 都会引发线程退出, 而return, 只能是在start_routine函数内执行才能导致线程退出。

3、其它线程调用了pthread_cancel函数取消了该线程

int pthread_cancel(pthread_t thread);

thread:线程标识符

调用该函数的执行流可以取消其它线程,但是需要知道其它线程的线程标识符,也可以执行流自己取消自己,传入自己的线程标识符。

如果线程组中的任何一个线程调用了exit函数, 或者主线程在main函数中执行了return语句, 那么整个线程组内的所有线程都会终止。

4.线程等待

4.1线程等待接口

#include int pthread_join(pthread_t thread, void **retval);

linux多线程服务器编程(全方面了解linux多线程服务)(3/13)


调用该函数,该执行流在等待线程退出的时候,该执行流是阻塞在pthread_joind当中的。

4.2线程等待和进程等待的不同

第一点不同之处是进程之间的等待只能是父进程等待子进程, 而线程则不然。线程组内的成员是对等的关系, 只要是在一个线程组内, 就可以对另外一个线程执行连接(join) 操作。

第二点不同之处是进程可以等待任一子进程的退出 , 但是线程的连接操作没有类似的接口, 即不能连接线程组内的任一线程, 必须明确指明要连接的线程的线程ID。

pthread_join()错误码:

linux多线程服务器编程(全方面了解linux多线程服务)(3/13)


4.3为什么要等待退出的线程?

如果不连接已经退出的线程, 会导致资源无法释放。 所谓资源指的又是什么呢?

1、已经退出的线程, 其空间没有被释放, 仍然在进程的地址空间之内。

2、新创建的线程, 没有复用刚才退出的线程的地址空间。

如果不执行连接操作, 线程的资源就不能被释放, 也不能被复用, 这就造成了资源的泄漏。

纵然调用了pthread_join, 也并没有立即调用munmap来释放掉退出线程的栈, 它们是被后建的线程复用了。 释放线程资源的时候, 若进程可能再次创建线程, 而频繁地munmap和mmap会影响性能, 所以将该栈缓存起来, 放到一个链表之中, 如果有新的创建线程的请求, 会首先在栈缓存链表中寻找空间合适的栈, 有的话, 直接将该栈分配给新创建的线程。

例:

#include #include #include #include #include void *ThreadWork(void *arg){ int *p = (int*)arg; printf("pid : %dn",syscall(SYS_gettid)); printf("i am work thread:%p, data:%dn",pthread_self(),*p); sleep(3); pthread_exit(NULL);}int main(){ int i = 1; pthread_t tid; int ret = pthread_create(&tid,NULL,ThreadWork,(void*)&i);//不要传临时变量,这里是示范 if(ret != 0) { perror("pthread_create"); return -1; } pthread_join(tid,NULL);//线程等待 while(1) { printf("i am main work threadn"); sleep(1); } return 0;}

5.线程分离

接口:#include int pthread_detach(pthread_t thread);

默认情况下, 新创建的线程处于可连接(Joinable) 的状态, 可连接状态的线程退出后, 需要对其执行连接操作, 否则线程资源无法释放, 从而造成资源泄漏。

如果其他线程并不关心线程的返回值, 那么连接操作就会变成一种负担: 你不需要它, 但是你不去执行连接操作又会造成资源泄漏。 这时候你需要的东西只是:线程退出时, 系统自动将线程相关的资源释放掉, 无须等待连接。

可以是线程组内其他线程对目标线程进行分离, 也可以是线程自己执行pthread_detach函数。

线程的状态之中, 可连接状态和已分离状态是冲突的, 一个线程不能既是可连接的, 又是已分离的。 因此, 如果线程处于已分离的状态, 其他线程尝试连接线程时, 会返回EINVAL错误。

笨笨网美国主机,w ww.2 b p .n e t
提醒:《linux多线程服务器编程(全方面了解linux多线程服务)(3/13)》最后刷新时间 2025-03-21 11:13:52,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《linux多线程服务器编程(全方面了解linux多线程服务)(3/13)》该内容的真实性请自行鉴别。