pthread_exit-----在linux主线程中的用途

大家都知道在一个线程中调用pthread_exit表示退出一个线程,并且pthread_exit的参数作为返回值提供给pthread_join函数获取。
那么如果在main函数创建了若干个线程后,在main函数最后调用pthread_exit会怎么样呢?已经创建的线程会不会随着main线程的退出而退出呢?
如果在main函数中调用的是exit,那么答案是所有线程随着main线程退出而退出。
但是对于pthread_exit而言,又是另外一个故事了。
在main函数中调用pthread_exit, 只有main线程自己退出,已经创建的线程并不会随之一起退出。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <unistd.h>
pthread_t ntid;

void printtids(const char *s) 
{
    pid_t pid;
    pthread_t tid;

    pid = getpid();
    tid = pthread_self();
    printf("%s pid %u tid %u (0x%x)\n", s, (unsigned int)pid, (unsigned int)tid, (unsigned int)tid);
}

void *thread_func(void *arg)
{
    sleep(1); /*故意在子线程中sleep 1,保证子线程在main线程以后退出*/
    printtids("new thread: ");
    return NULL; 
}

int main(int argc, char *argv[])
{
    int rc; 

    rc = pthread_create(&ntid, NULL, thread_func, NULL);
    if (rc != 0) {
        printf("pthread_create error: %s\n", strerror(errno));
    }   
    printtids("main thread: ");
    pthread_exit(NULL);   /*main线程退出,后面的话不会打印了*/                                                                                                                                                    
    printf("main process is exited...\n");
    return 0;
}

编译运行:
发现进程ID是一样的,线程ID不一致,并且在”main thread…”, 输出以后停顿了一下(sleep 1)后输出”new thread…”.
而且没有输出“main process is exited…”
说明pthread_exit 只退出了main线程,其它线程并没有随之退出

gwwu@hz-dev2.aerohive.com:~/test/thread>gcc -g thread1.c -o thread1 -lpthread -Wall
gwwu@hz-dev2.aerohive.com:~/test/thread>./thread1 
main thread:  pid 19066 tid 291600128 (0x11617700)
new thread:  pid 19066 tid 291591936 (0x11615700)
gwwu@hz-dev2.aerohive.com:~/test/thread>
引用\[1\]:在示例代码,使用了pthread_create函数创建了一个新的线程,并在新线程执行了new_thread_start函数。在线程,使用pthread_join函数等待新线程的结束,并获取新线程的返回值。最后,线程打印出新线程的终止代码。\[1\] 引用\[2\]:在另一个示例代码,同样使用了pthread_create函数创建了一个新的线程,并在新线程执行了new_thread_start函数。不同的是,线程没有使用pthread_join函数等待新线程的结束,而是直接退出。\[2\] 引用\[3\]:pthread_join函数用于等待指定的线程结束,并获取线程的返回值。它的第一个参数是需要等待的线程的ID号,第二个参数是一个指向指针的指针,用于存储线程的返回值。如果不关心线程的返回值,可以将第二个参数设置为NULL。pthread_exit函数用于退出当前线程,并返回一个指定的值。\[3\] 综上所述,pthread_exit函数用于退出线程,而pthread_join函数用于等待线程的结束并获取线程的返回值。如果需要传递整型数据,可以将整型数据作为参数传递给新线程的函数,并在新线程进行相应的处理。 #### 引用[.reference_title] - *1* *2* [Linux线程(2)——创建、终止和回收(pthread_create()、pthread_exit()、pthread_join())](https://blog.csdn.net/cj_lsk/article/details/130229709)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [系统编程05-线程(pthread_create、pthread_join、pthread_exit)](https://blog.csdn.net/weixin_48102054/article/details/127331663)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值