c语言主线程退出子线程,简单了解C语言中主线程退出对子线程的影响

本文详细探讨了C语言中主线程退出时对子线程的影响。当主线程提前退出,子线程并不会立即退出,除非整个进程结束。线程的生命周期依赖于其所属的进程,主线程的退出并不直接导致子线程的终止。通过示例代码,阐述了主线程被子线程终止以及主线程随进程退出两种情况下的线程行为。
摘要由CSDN通过智能技术生成

这篇文章主要介绍了简单了解C语言中主线程退出对子线程的影响,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

对于程序来说,如果主进程在子进程还未结束时就已经退出,那么Linux内核会将子进程的父进程ID改为1(也就是init进程),当子进程结束后会由init进程来回收该子进程。

那如果是把进程换成线程的话,会怎么样呢?假设主线程在子线程结束前就已经退出,子线程会发生什么?

在一些论坛上看到许多人说子线程也会跟着退出,其实这是错误的,原因在于他们混淆了线程退出和进程退出概念。实际的答案是主线程退出后子线程的状态依赖于它所在的进程,如果进程没有退出的话子线程依然正常运转。如果进程退出了,那么它所有的线程都会退出,所以子线程也就退出了。

主线程先退出

先来看一个主线程先退出的例子:

#include

#include

#include

void* func(void* arg)

{

pthread_t main_tid = *static_cast(arg);

pthread_cancel(main_tid);

while (true)

{

//printf("child loops

");

}

return NULL;

}

int main(int argc, char* argv[])

{

pthread_t main_tid = pthread_self();

pt

C语言中,当线程需要进行一段时间的延时时,为了不影响并行运行的线程,你可以使用互斥锁(mutex)或者条件变量(condition variable)来管理同步。下面是一个基本的例: 1. **互斥锁**: - 线程在延时之前获取互斥锁。 - 进行延时操作。 - 然后释放互斥锁,让线程有机会执行。 - 线程会尝试获取这个锁,但由于线程已释放,线程可以继续执行。 ```c #include <pthread.h> pthread_mutex_t mutex; int done = 0; void *thread_func(void *arg) { while (!done) { // 线程在这里等待 pthread_mutex_lock(&mutex); if (done) { // 如果线程设置了标志,线程立即退出 pthread_mutex_unlock(&mutex); return NULL; } pthread_cond_wait(&cv, &mutex); // 等待线程通知 pthread_mutex_unlock(&mutex); } // 线程处理结束后的逻辑... } int main() { pthread_mutex_init(&mutex, NULL); pthread_create(&tid, NULL, thread_func, NULL); // 线程延时并设置标志 sleep(5); // 延迟5秒 pthread_mutex_lock(&mutex); done = 1; // 设置标志告诉线程线程已完成延时 pthread_cond_signal(&cv); // 通知线程 pthread_mutex_unlock(&mutex); pthread_join(tid, NULL); pthread_mutex_destroy(&mutex); } ``` 2. **条件变量**: 使用`pthread_cond_wait`和`pthread_cond_signal`,线程唤醒等待的线程。 在这个例中,关键在于通过控制互斥锁和条件变量之间的交互,使得线程能够感知线程是否已经完成了它的延时任务。这样,即使线程延迟,也不会直接影响线程的执行流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值