线程取消点|学习笔记

简介: 快速学习线程取消点

开发者学堂课程【物联网开发- Linux 高级程序设计全套视频线程取消点】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/660/detail/11064


线程取消点

 

内容介绍

一、线程取消点

二、调用 void pthread_testcancel 函数

 

一、线程取消点

线程被取消后,该线程并不是马上终止,默认情况下线程执行到消点时才能被终止。

1、在main函数当中,创建一个线程,然后sleep(3)秒取消线程,等待线程结束、main函数结束。

(1)、代码:

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

{

pthread_t  tid1;

Int ret = 0 ;

ret = pthread_create(&tid1, NULL, thread_cancel, NULL);

If(ret != 0)

perror(“pthread_create”);

sleep(3);

pthread_cancel(tid1);

pthread_join(tid1,NULL);

return 0 ;

}

2、创建线程设置可以被取消

(1)、代码:

void *thread_cancel(void *arg)

{

//PTHREAD_CANCEL_ENABLE取消的状态可以被取消

pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NUL);

//pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL);

while(1)

{

printf(“this is my new thread_cancel\n”);

sleep(1);

}

return NULL ;

}

运行代码:

[05_day]gcc pthread_cancel.c -o pthread_cancel -lpthread

[05_day]./pthread_cancel

this is my new thread_cancel

this is my new thread_cancel

this is my new thread_cancel

[05_day]

3秒钟被取消了。

3、在while(1)后面加上分号;

(1)、代码:

while(1);

/*{

printf(“this is my new thread_cancel\n”);

sleep(1);

}*/注释

代码运行结果:

[05_day]gcc pthread_cancel.c -o pthread_cancel -lpthread

[05_day]./pthread_cancel

//代码不会结束

sleep(3);//3秒之后

pthread_cancel(tid1);//取消

pthread_join(tid1,NULL);Return 0 ;//阻塞,因为线程没结束

return 0 ;

 

二、调用 void pthread_testcancel 函数

1、调用void pthread_testcancel函数相当于取消点,在循环里面可以调用此函数,当别的线程取消调用此函数的时候,被取消的线程执行到此函数时就结束。

(1)、代码:

void *thread_cancel(void *arg)

{

pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NUL);

//pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL);

while(1)

pthread_testcancel();

/*{

printf(“this is my new thread_cancel\n”);

sleep(1);

}*/

return NULL ;

}

运行结果:

[05_day]gcc pthread_cancel.c -o pthread_cancel -lpthread

[05_day]./pthread_cancel

[05_day]

2、默认情况下,线程允许被取消,即便允许被取消,必须执行到取消点时才能被取消

(1)、代码:

void *thread_cancel(void *arg)

{

pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NUL);

//pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL);

while(1)

{

printf(“this is my new thread_cancel\n”);

sleep(1);

}

return NULL ;

}

运行结果:

[05_day]gcc pthread_cancel.c -o pthread_cancel -lpthread

[05_day]./pthread_cancel

this is my new thread_cancel

this is my new thread_cancel

this is my new thread_cancel

[05_day]

POSIX.1保证线程在调用表1、表2中的任何函数时,取消点都会出现。

表1:image.gif

image.gif

表2:

image.gif

image.gif

image.gif

image.gif1、当执行到表1、表2两张表里面的函数时,就会出现取消点,然后被取消。

(1)、代码:

void *thread_cancel(void *arg)

{

pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NUL);

//pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL);

while(1)

{

printf(“this is my new thread_cancel\n”);

sleep(1);//表1里的函数

}

return NULL ;

}

2、代码验证:

(1)、代码:

void *thread_cancel(void *arg)

{

pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);

while(1)

{

//pthread_testcancel();

}

return NULL;

(2)、在while里面加pthread_testcancel()和不加是有区别的,

不加的话就会取消不了,加了之后才能被成功取消。

要么调用函数pthrean_testcancel();

要么调用表1、表2里面的函数。

相关文章
|
5月前
|
网络协议 Linux C++
Linux C/C++ 开发(学习笔记十一 ):TCP服务器(并发网络网络编程 一请求一线程)
Linux C/C++ 开发(学习笔记十一 ):TCP服务器(并发网络网络编程 一请求一线程)
99 0
|
2月前
|
调度
多线程学习笔记
这篇文章是多线程学习笔记,涵盖了线程与进程的概念、多线程实现方式、线程状态、线程同步与不安全示例、死锁问题以及生产者与消费者问题等多线程编程的关键知识点。
多线程学习笔记
|
5月前
|
NoSQL 网络协议 关系型数据库
redis-学习笔记(redis 单线程模型)
redis-学习笔记(redis 单线程模型)
49 3
|
5月前
|
安全 Java 编译器
多线程 (下) - 学习笔记2
多线程 (下) - 学习笔记
39 1
|
5月前
|
存储 算法 Java
多线程 (下) - 学习笔记1
多线程 (下) - 学习笔记
42 1
|
5月前
|
设计模式 安全 NoSQL
多线程 (上) - 学习笔记2
多线程 (上) - 学习笔记
42 1
|
5月前
|
Java 数据库连接 程序员
【后台开发】TinyWebser学习笔记(2)线程池、数据库连接池
【后台开发】TinyWebser学习笔记(2)线程池、数据库连接池
56 4
|
5月前
多线程学习笔记(一)
创建线程有3种方式:继承Thread类、实现Runnable接口或Callable接口。继承Thread类时,重写run()方法并调用start()启动线程。实现Runnable接口时,实现run()方法,通过Thread的target创建线程对象并用start()启动。
27 1
|
5月前
|
Java API 调度
多线程 (上) - 学习笔记1
多线程 (上) - 学习笔记
36 0
|
5月前
|
Java C++
多线程学习笔记(二)
1. 子线程先执行:启动子线程后立即调用`join()`,主线程会等待子线程完成。 `suspend()`方法。 3. `synchronized` vs `Lock`:前者是关键字,后者是接口;前者可用在代码块和方法,后者在代码中显式;前者自动释放锁,后者需`finally`释放;前者无超时/中断控制,后者可设定;前者非公平,后者可公平/不公平,且支持读写锁。 4. `synchronized`底层实现:基于 Monitor 模型,JVM层面的锁定机制,通过 monitors 和 monitorenter/monitorexit 指令实现。
23 0