linux系统编程 线程 p1

news/2024/4/30 3:39:21

线程

  • 1.线程的概念
  • 2.线程的创建/终止/取消,栈的清理
    • 2.1线程创建
    • 2.2线程终止
    • 2.3 栈的清理

1.线程的概念

线程就是一个正在运行的函数。
posix线程是一套标准,而不是实现。
openmp线程。
线程标识:pthread_t (linux环境下是整形数)
就像每个进程有一个进程ID一样,每个线程也有一个线程ID。进程ID在整个系统中是唯一的,但线程ID不同,线程ID只有在它所属的进程上下文中才有意义。
进程ID是用pid_t数据类型来表示的,是一个非负整数。线程ID是用pthread_t 数据类型来表示的,实现的时候可以用一个结构来代表pthread_t数据类型,所以可移植的操作系统实现不能把它作为整数处理。

处理器也是以线程为调度单位。
线程实际是以进程标识来描述的。

pthread_equal() 比较线程标识;
pthread_self(void) 返回当前线程标识。

2.线程的创建/终止/取消,栈的清理

2.1线程创建

pthread_create();

NAMEpthread_create - create a new threadLIBRARYPOSIX threads library (libpthread, -lpthread)SYNOPSIS#include <pthread.h>int pthread_create(pthread_t *restrict thread,const pthread_attr_t *restrict attr,void *(*start_routine)(void *),void *restrict arg);

传入的参数可以做成结构体,传给arg。

程序实例

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <iostream>
#include <errno.h>
#include <cstring>using namespace std;static void* func(void* p) {cout << "thread is working" << endl;return 0;
}int main() {cout << "begin" <<endl;pthread_t tid;int err;err = pthread_create(&tid, NULL, func, NULL);if (err) {cerr << "thread create:" << strerror(err) << endl;exit(0);}cout << "end" <<endl;exit(0);
}
[root@iZ2zeirmyddvdjh8g2zyxzZ pthread]# ./create1 
begin
end

没有出现thread is working
这种现象是因为:线程的调度取决于调度器的调度策略。

2.2线程终止

3种方式:
1)线程从启动例程中返回,返回值就是线程的退出码;
2)线程可以被同一进程中的其他线程取消
3)线程调用pthread_exit()函数。

pthread_exit()

NAMEpthread_exit - terminate calling threadLIBRARYPOSIX threads library (libpthread, -lpthread)SYNOPSIS#include <pthread.h>[[noreturn]] void pthread_exit(void *retval);

pthread_join() ----> wait相当于收尸

NAMEpthread_join - join with a terminated threadLIBRARYPOSIX threads library (libpthread, -lpthread)SYNOPSIS#include <pthread.h>int pthread_join(pthread_t thread, void **retval);

程序实例,补全刚才程序

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <iostream>
#include <errno.h>
#include <cstring>using namespace std;static void* func(void* p) {cout << "thread is working" << endl;pthread_exit(NULL);return 0;
}int main() {cout << "begin" <<endl;pthread_t tid;int err;err = pthread_create(&tid, NULL, func, NULL);if (err) {cerr << "thread create:" << strerror(err) << endl;exit(0);}//等线程运行完等待收尸pthread_join(tid, NULL);cout << "endl" <<endl;exit(0);
}
[root@iZ2zeirmyddvdjh8g2zyxzZ pthread]# ./create1 
begin
thread is working
end

2.3 栈的清理

线程可以安排它退出时需要调用的函数,这与进程在退出时可以用atexit函数安排退出是类似的。这样的函数称为线程清理处理程序(thread cleanup handler)。一个线程可以建立多个清理处理程序。处理程序记录在栈中,也就是说,它们的执行顺序与它们注册时相反

NAMEpthread_cleanup_push, pthread_cleanup_pop - push and pop thread cancelation clean-up handlersLIBRARYPOSIX threads library (libpthread, -lpthread)SYNOPSIS#include <pthread.h>void pthread_cleanup_push(void (*routine)(void *), void *arg);void pthread_cleanup_pop(int execute);

钩子函数代码实例

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <iostream>
#include <errno.h>
#include <cstring>using namespace std;static void cleanup_function(void* arg) {cout << (const char*)arg << endl;
}static void* func(void* p) {cout << "thread is working" << endl;string s1 = "haha1";string s2 = "haha2";// 使用 std::string 的 c_str() 方法来获取 const char* 类型的指针pthread_cleanup_push(cleanup_function, (void*)s1.c_str());pthread_cleanup_push(cleanup_function, (void*)s2.c_str());pthread_exit(NULL);//必须成对出现pthread_cleanup_pop(1);pthread_cleanup_pop(1);return 0;
}int main() {cout << "begin" <<endl;pthread_t tid;int err;err = pthread_create(&tid, NULL, func, NULL);if (err) {cerr << "thread create:" << strerror(err) << endl;exit(0);}pthread_join(tid, NULL);cout << "end" <<endl;exit(0);
}
[root@iZ2zeirmyddvdjh8g2zyxzZ cleanup]# ./create1 
begin
thread is working
haha2
haha1
end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.cpky.cn/p/11601.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

macU盘在电脑上读不出来 u盘mac读不出来怎么办 macu盘不能写入

对于Mac用户来说&#xff0c;使用U盘是很常见的操作&#xff0c;但有时候可能会遇到Mac电脑无法读取U盘的情况&#xff0c;这时候就需要使用一些特定的工具软件来帮助我们解决问题。本文就来告诉大家macU盘在电脑上读不出来是怎么回事&#xff0c;u盘mac读不出来怎么办。 一、m…

DNS和HTTP

DNS应用层协议 域名解析系统 使用IP地址&#xff0c;来描述设备在网络上的位置 IP地址并不适合来进行传播网站&#xff0c;就采用了域名的方式来解决网站传播的问题。如www.baidu.com这样类似的就很容易让人记住。其域名就直接代表了这个网站。而且有一套自动的系统会将域名解…

JVM(Java虚拟机)

文章目录 一、JVM简介1.1 JVM概念1.2 什么是Java虚拟机呢&#xff1f;Java虚拟机的好处是什么呢&#xff1f; 二、JVM整体组成部分三、类加载器3.1 类加载子系统3.2 类加载过程3.2.1 装载(Load)3.2.2 链接(Link)3.2.3 初始化(Initialize) 四、运行时数据区4.1 方法区&#xff0…

爬虫学习第一天

爬虫-1 爬虫学习第一天1、什么是爬虫2、爬虫的工作原理3、爬虫核心4、爬虫的合法性5、爬虫框架6、爬虫的挑战7、难点8、反爬手段8.1、Robots协议8.2、检查 User-Agent8.3、ip限制8.4、SESSION访问限制8.5、验证码8.6、数据动态加载8.7、数据加密-使用加密算法 9、用python学习爬…

微信小程序生命周期管理:从数据初始化到事件绑定

作为一个独立的应用开发平台,微信小程序提供了自己的生命周期机制,与我们熟悉的Vue.js框架有一些差异。掌握小程序生命周期的特点和使用技巧,对于开发高质量的小程序应用至关重要。深入理解和掌握小程序生命周期的使用技巧,将有助于我们构建出更加健壮和可维护的小程序应用。 小…

OpenAI 宣布, ChatGPT 网页端无需注册就能立即使用(2024年4月1日)

今天&#xff0c;OpenAI宣布&#xff0c;为了让更多人轻松体验人工智能的强大功能&#xff0c;现在无需注册账户即可立即使用 ChatGPT。这一变化是他们使命的核心部分&#xff0c;即让像 ChatGPT 这样的工具广泛可用&#xff0c;让世界各地的人们都能享受到 AI 带来的好处。 网…