pthread 立即停止线程_【求助】在主线程里如何终止子线程的执行?

本文探讨了在Linux环境下pthread_cancel函数的正确使用方法及其行为特点。通过一个具体的代码示例,展示了当尝试取消一个无限循环中的线程时所遇到的问题,并讨论了解决方案,包括如何配置线程取消类型和在代码中添加取消点。
摘要由CSDN通过智能技术生成

示例代码如下:

#include

#include

#include

#include

void* func(void *)

{

while (1)

{

;

}

return NULL;

}

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

{

pthread_t thrd;

pthread_attr_t attr;

pthread_attr_init(&attr);

pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

if ( pthread_create(&thrd, &attr, func, NULL) )

{

perror("pthread_create error");

exit(EXIT_FAILURE);

}

if ( !pthread_cancel(thrd) )

{

printf( "pthread_cancel OKn" );

}

sleep( 10 );

return 0;

}

//pthread_cancel执行成功了,但是子线程仍然在内存里运行,请问这是为什么呢?

|

很多POSIX多线程标准函数在LINUX上不被支持,你仔细查一下这个函数在LINUX上是否被支持!!!!!

|

LINUX上有直接杀死子线程的函数么?

我记得是无。。。。。。楼主仔细查下

|

看看pthread_cancel的man,这个函数是在一些等待函数中才能中断的。

你把while(1){;}当中改成sleep(1)看看。

|

只能使用pthread_cancle.

如果强制杀掉的话,这个线程里的资源谁去释放?如果有互斥锁话就有可能造成死锁。

|

是因为这样的!

在posix thread中线程有两中取消状态:立即取消和延迟取消

立即取消就是pthread_cancel之后,不管理线程在干什么,马上终止这个线程

而延迟取消是在pthread_cancel之后,线程会继续运行,直到遇到一个"取消点函数"

系统默认的是延迟取消

象在你的这个线程中,根本就没有取消点函数,所以你这个线程是不会结束的.

如果想要结束线程有几个方法

1.不线程设置为立即取消

pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);

2.在你的线程中加入一些取消点函数的调用

while( 1 )

{

//sleep(1)或者pthread_testcancle();

}

在C语言中,你可以使用`pthread_create()`函数来创建一个新的子线程。这个函数需要四个参数:线程函数的指针、线程数据(通常是一个指向void类型的指针)、新线程的堆栈大小和线程标识符。以下是一个简单的示例,展示如何创建子线程并在其中打印指定的消息: ```c #include <stdio.h> #include <pthread.h> // 线程函数 void* thread_function(void* arg) { printf("20221605的子线程在运行\n"); pthread_exit(NULL); // 结束线程并返回控制权给线程 } int main() { pthread_t child_thread; // 存储子线程ID pthread_attr_t attr; // 线程属性 // 初始化线程属性 pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); // 设置为自动删除线程(当线程退出时,子线程也终止) // 创建子线程 if (pthread_create(&child_thread, &attr, thread_function, NULL) != 0) { perror("创建子线程失败"); return 1; } // 线程可以继续执行其他任务,这不做阻塞 // 如果你想让线程等待子线程结束,可以添加pthread_join(child_thread, NULL); // 等待子线程完成 pthread_join(child_thread, NULL); printf("子线程已结束\n"); pthread_attr_destroy(&attr); // 销毁线程属性 return 0; } ``` 在这个例子中,线程创建了子线程`thread_function`,该函数会打印消息"20221605的子线程在运行"。`pthread_create()`成功后,线程不会立即阻塞,而是继续执行。当你想让线程等待子线程结束后,可以使用`pthread_join()`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值