unix c 11
多线程(thread)
操作系统支持多进程,进程内部使用多线程。
进程是 重量级的,拥有自己 独立的内存空间。
线程是 轻量级的,不需要拥有自己 独立的内存空间,线程的内存空间:1 共享进程的内存空间 2 每个线程拥有一个与其他线程独立的栈。
因此,遇到大量的并行,多半使用多线程技术。
一般来说,网络编程 离不开多线程。
进程中支持多线程,但必须有一个主线程(main)。
多个线程之间互相独立,但也互相影响(共享进程的内存)。
主线程和其他线程也是独立的,但有特殊性:
1 其他线程都是通过主线程 直接/间接 启动
2 主线程结束,进程结束->所有线程都结束
线程并行的原理和机制
传统上说,代码有三种运行的方式:
顺序执行/循环执行/选择执行
代码的并行:
真正意义的并行 是不存在的,我们看到的并行都是针对时间段的。
CPU把自己工作时间分成 极小的CPU时间片,每个线程都会拿到CPU时间片,CPU时间片的持有者可以运行CPU(CPU时间片的大小决定运行时间)。当我们感知(过了时间段)的时候,多个线程都运行了N个时间片,因此感觉上是并行。
UC中对于线程的开发已经做了一系列的函数,放入libpthread.so中。因此 连接时,需要加-lpthread,l可以省略,所有线程的函数 在连接时必须加 -pthread。
使用pthread.h头文件,都以pthread_ 开头。
创建线程函数:
int pthread_create(pthread_t* id, pthread_attr_t* attr, void*(*f)(void*), void* p )
id 用于存储 线程id
attr 传入属性,一般给NULL,使用默认属性即可
f 是函数指针,线程执行的代码放入f函数
p 是f的参数,可以在创建线程时传入
返回:
成功返回0,失败 返回 错误编号。线程的错误码不能使用errno,而是 由函数直接返回。
注:函数f不需要显式调用,create线程后自动执行f的代码,同时 p 做f的参数。
关于函数的返回:
1 不能返回指向局部变量的指针
2 不要直接返回 复合类型的局部变量
3 只有指向 static 局部变量的指针可以返回
线程 用 pthread_join 取返回值。
线程有分离和非分离状态,默认是 非分离状态,支持pthread_join,并且资源在join函数结束之后才释放,而不是 线程结束马上释放。
分离状态 线程结束马上释放资源,处于分离状态的线程join没作用。(了解)
pthread_detach(id);//可以把线程id设置为分离
线程同步:
线程 共享进程的系统资源(全部、堆、文件),如果一个线程改变了其中的某项,就会影响其他的线程。因此多个线程在操作共享资源时,使用 线程同步 技术防止数据出现不一致,不完整的问题。
互斥(mutex)就是一种线程同步的技术。能解决同步问题,但 会大幅降低多线程的效率,所以不要滥用
互斥的使用步骤:
1 定义一个互斥
pthread_mutex_t lock;
2 初始化 互斥,两种方式:
lock = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_init(&lock);
3 加锁,取互斥(只有一个可以取得,其他被锁定)
pthread_mutex_lock(&lock);
4 执行自己的代码
5 释放锁,还互斥(激活被锁定的线程)
pthread_mutex_unlock(&lock);
6 销毁互斥(不能再次使用)
pthread_mutex_destroy(&lock);
在使用互斥时,一定要避免死锁,因此没有及时释放互斥导致其他所有线程 锁死。
互斥是线程同步的特有技术,而信号量是可以控制进程和线程的技术。(与IPC的信号量集不是一个技术)
信号量是一个计数器,当 计数为1 时,和互斥效果一致。信号量的使用步骤:
1 定义一个信号量
sem_t sem; //不在pthread.h中,在semaphore.h
2 初始化信号量
sem_init(&sem,0,int 计数值)
第一个参数是 信号量的指针
第二个参数必须是0,0代表线程,非0代表进程
第三个参数是计数器的初始值
3 获取一个信号量(计数-1)
sem_wait(&sem);
4 执行代码
5 释放一个信号量(计数+1)
sem_post(&sem);
6 不用了就可以销毁
sem_destroy(&sem);
unix c 11的更多相关文章
- 0级搭建类005-Oracle Solaris Unix安装 (11.4) 公开
项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列目前不对外发布,仅作为博客记录.如学员在实际工作过程中需提前 ...
- Unix历史及相关概念回顾
欢迎来到Unix的世界 很多人都用了很多年的Unix(其实更熟悉的是叫Linux),也接触到Unix世界中的各种概念,比如GCC.GNU.BSD.POSIX.GPL等等,也大都知道一些传奇的如雷贯耳的 ...
- UnixShell编程(第三版)
这本书相当老了,04年的,现在 在linux上做实验. 1,date 显示日期. 2,who 显示用户,who am i 3,echo 后面字符串会全部输出,,会过滤掉多余空格,单双引号,分号等. ...
- lsof 命令用法详解
lsof 命令用法详解 作用 用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP.UDP).找回/恢复删除的文件.是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所 ...
- Docker: 安装配置入门[二]
一.安装配置启动 1.环境 [root@docker1 ~]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) [root@d ...
- Redis<六> Key通用操作
1). KEYS pattern : 查找所有符合给定模式 pattern 的 key . 如 keys * , keys *list* 2). DEL key [key ...] : 删除给定的一个 ...
- Linux服务之nginx服务篇五(静态/动态文件缓存)
一.nginx实现静态文件缓存实战 1.nginx静态文件缓存 如果要熟练使用nginx来实现文件的缓存,那下面的几个指令你必须要牢记于心 (1)指令1:proxy_cache_path 作用:设置缓 ...
- 地区sql
/*Navicat MySQL Data Transfer Source Server : localhostSource Server Version : 50136Source Host : lo ...
- 转connect() to unix:/var/run/php-fpm.sock failed (11: Resource temporarily unavailable)
网站常出现502 bad gateway,程序没有问题. 根据nginx日志:connect() to unix:/var/run/php-fpm.sock failed (11: Resource ...
随机推荐
- bzoj3039 玉蟾宫
Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地.这片土地被分成N*M个格子,每个格子里写着'R'或者' ...
- CSS flex让所有灵活的项目都带有相同的长度,忽略它们的内容:
.flexbox { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; displa ...
- Codeforces Round #327 (Div. 1) D. Top Secret Task
D. Top Secret Task time limit per test 3 seconds memory limit per test 256 megabytes input standard ...
- 什么是 docker?
关于 Docker 是什么,有个著名的隐喻:集装箱.但是它却起了个“码头工人”( docker 的英文翻译)的名字.这无疑给使用者很多暗示:“快来用吧!用了 Docker ,就像世界出现了集装箱,这样 ...
- linux文件系统学习
linux系统支持很多种文件系统. 1. 如何确认当前系统挂载了哪些文件系统? 使用mount命令可以查看当前系统上已经挂载了哪些文件系统, sh-# mount rootfs on / type r ...
- 第34讲 UI组件之 ProgressDialog和Message
第34讲UI组件之 ProgressDialog和Message 1.进度对话框 ProgressDialog <1>简介 ProgressDialog是AlertDialog类的一个扩展 ...
- Spring 的优秀工具类盘点第 1 部分
文件资源操作 文件资源的操作是应用程序中常见的功能,如当上传一个文件后将其保存在特定目录下,从指定地址加载一个配置文件等等.我们一般使用 JDK 的 I/O 处理类完成这些操作,但对于一般的应用程序来 ...
- poj 1486 Sorting Slides(二分图匹配的查找应用)
Description Professor Clumsey is going to give an important talk this afternoon. Unfortunately, he i ...
- install samba on crux without net.
1. 解压文件 tar -xvfz samba-.tar.gz 2. 进入目录 cd samba- 3. 配置 ./configure 4. 编译 make 5. 安装 make install
- JS 事件冒泡整理 浏览器的事件流
JavaScript与HTML的交互通过事件来实现.而浏览器的事件流是一个非常重要的概念.不去讨论那些古老的浏览器有事件捕获与事件冒泡的争议, 只需要知道在DOM2中规定的事件流包括了三个部分,事件捕 ...