Linux多线程编程之pthread
转载出处:https://blog.csdn.net/skyroben/article/details/72793409
1.背景知识
Linux没有真正意义上的线程,它的实现是由进程来模拟,所以属于用户级线程,位于libpthread共享库(所以线程的ID只在库中有效),遵循POSIX标准。
Windows下有一个真正的数据结构TCB来描述线程。
Linux上两个最有名的线程库LinuxThreads和NPTL。
Linux两个线程模型的比较:
Linux线程模型的比较
Linux下多线程虚拟地址空间的映射类似于用vfork创建多个子进程。
2.进程和线程的区别
进程:程序的一个动态运行实例,承担分配系统资源的实例。(Linux实现进程的主要目的是资源独占)
线程:在进程的内部运行(进程的地址空间)运行的一个分支,也是调度的基本单位(调度按LWP调度)。(Linux实现线程的主要目的是资源共享)
线程所有的资源由进程提供。
单进程:只有一个进程的线程(LWP=PID)。
LWP:轻量级进程。
由于同一进程的多个线程共享同一地址空间,因 此Text Segment、Data Segment都是共享的,如果定义一个函数,在各线程中都可以调用,如果定义一个全局变量,在各线程中都可以访问到,除此之外,各线程还共享以下进程资源和环境:
1. 文件描述符表2. 每种信号的处理方式(SIG_IGN、SIG_DFL或者自定义的信号处理函数)3. 当前工作目录4. 用户id和组id
1.线程ID2. 上下文信息,包括各种寄存器的值、程序计数器和栈指针3. 栈空间4. errno变量5. 信号屏蔽字6. 调度优先级
多线程程序的优点(相对进程比较而言):
3.进程控制
创建线程函数———pthread_create函数
- #include <pthread.h>
- int pthread_create(pthread_t * thread, const pthread_arrt_t* attr,void*(*start_routine)(void *), void* arg);
(1)thread参数是新线程的标识符,为一个整型。
终止线程———pthread_cancel函数和pthread_exit函数
- #include <pthread.h>
- int pthread_cancel(pthread_t thread);
- #include <pthread.h>
- void pthread_exit(void * retval);
(2)pthread_exit函数通过retval参数向线程的回收者传递其退出信息。它执行之后不会返回到调用者,且永远不会失败。
线程等待———pthread_join
- #include <pthread.h>
- void pthread_join(pthread_t thread,void ** retval);
(1)调用该函数的线程将挂起等待,直到id为thread的线程终止。
4.分离线程
(例如栈)是不释放的。(默认情况下线程的创建都是可结合的)
4. 如果一个可结合线程结束运行但没有被join,会导致部分资源没有被回收,所以创建线程者应该调用pthread_join来等待线程运行结束,并可得到线程的退出代码,回收其资源。
- #include <stdio.h>
- #include <error.h>
- #include <stdlib.h>
- #include <pthread.h>
- void* thread_run(void* _val)
- {
- pthread_detach(pthread_self()); //注释这句代码join success
- printf("%s\n", (char*)_val);
- return NULL;
- }
- int main()
- {
- pthread_t tid;
- int tret = pthread_create(&tid, NULL, thread_run, "thread_run~~~~~");
- //线程创建成功之后,程序的执行流变成两个,一个执行函数thread_run,一个继续向下执行。
- if (tret == 0)
- {
- sleep(1);
- int ret = pthread_join(tid, NULL);
- if (ret == 0)
- {
- printf("pthread_join success\n");
- return ret;
- }
- else
- {
- printf("pthread_join failed info: %s\n", strerror(ret));
- return ret;
- }
- }
- else
- {
- printf("create pthread failed info: %s", strerror(tret));
- return tret;
- }
- }
运行结果:
Linux多线程编程之pthread相关推荐
- Linux多线程编程之pthread (多线程编程) --- (高级)---原作优秀
https://blog.csdn.net/skyroben/article/details/72793409 (博客优秀) 1.背景知识 Linux没有真正意义上的线程,它的实现是由进程来模拟,所以 ...
- 多线程编程之Linux环境下的多线程(三)——好文
http://www.cnblogs.com/kuliuheng/p/4063892.html 前面两篇文章都讲述了Linux环境下的多线程编程基础知识,也附带了典型实例.本文主要比较一下Linux环 ...
- linux c编程之fcntl
fcntl可实现对指定文件描述符的各种操作,其函数原型如下: int fcntl(int fd, int cmd, ... /* arg */ ); 其中,操作类型由cmd决定.cmd可取如下值: F ...
- python 多线程编程之_thread模块
python 多线程编程之_thread模块 参考书籍:python核心编程 _thread模块除了可以派生线程外,还提供了基本的同步数据结构,又称为锁对象(lock object,也叫原语锁.简单锁 ...
- linux C编程之makefile
linux C编程之makefile 目的: 基本掌握了 make 的用法,能在Linux系统上编程. 环境: Linux系统,或者有一台Linux服务器,通过终端连接.一句话 ...
- Linux网络编程之IP地址转换为无符号整数的方法
Linux网络编程之IP地址转换为无符号整数的方法,代码如下:(没考虑异常输入) #include <stdio.h> #include <string.h> #include ...
- iOS多线程编程之NSThread的使用(★★★推荐,为原作者点赞★★★)
文章来源:http://blog.csdn.net/totogo2010/article/details/8010231 1.简介: 1.1 iOS有三种多线程编程的技术,分别是: 1..NSThre ...
- Linux网络编程之sockaddr与sockaddr_in,sockaddr_un结构体详细讲解
Linux网络编程之sockaddr与sockaddr_in,sockaddr_un结构体详细讲解 (1)sockaddr struct sockaddr { unsigned short sa_ ...
- [Cocoa]深入浅出Cocoa多线程编程之 block 与 dispatch quene
深入浅出 Cocoa 多线程编程之 block 与 dispatch quene 罗朝辉(http://www.cppblog.com/kesalin CC 许可,转载请注明出处 block 是 Ap ...
- linux读取文件修改时间函数,Linux服务器编程之utime()函数修改文件存取时间
Linux服务器编程之utime()函数修改文件存取时间 C语言utime()函数:修改文件的存取时间和更改时间 头文件: #include #include 定义函数: int utime(cons ...
最新文章
- 普通二叉树、二叉查找树、平衡二叉树常见操作汇总
- 赫夫曼树(哈夫曼树)
- 2、ALTER TABLE:修改数据表
- 计算机网络实验做什么的,计算机网络实验,做网线.ppt
- 华为笔记本软件商店_华为应用市场 PC 端体验:干净好用 - 华为
- java 网络编程 方式_JAVA网络编程
- java的课后作业咋写_写的简单的java第三季的课后作业
- 详解 Qt 串口通信程序全程图文 (4)
- linux进程作为服务,将一个监视进程做成linux系统服务
- 神秘组织正在运行数百个恶意 Tor 中继
- python 写文件 编码_Python文件写入时的编码问题解决
- PAT甲级1002 多项式相加
- Erlang进程堆垃圾回收机制
- matlab混合copula,​MATLAB实战—最优Copula函数的选择
- 10分钟搞定工作周报
- protoc执行命令
- 服务器后台自动运行程序和停止
- 提高软件CPU占用率
- 服务器客户端证书,客户端如何验证HTTPS服务端证书信息
- idea回退操作reset、revert