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);    

转载于:https://www.cnblogs.com/elisha-blogs/p/3771191.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# .net core 使用自定义的WebProxy

为什么80%的码农都做不了架构师?>>> 因为.net core 的System.Net 中没有提供WebProxy这个方法,所以可以根据需求实现一个. public class CoreWebProxy : IWebProxy{public readonly Uri Uri;private readonly bool bypass;public CoreWebProxy(Uri uri,…

2015年08月

2015年07月 - 2015年09月 ● 一般而言。。。 一般而言,牙周病轻者有口臭、牙龈红肿疼痛、刷牙流血等症状,严重时会造成牙龈萎缩、牙齿敏感、牙齿摇动等情况。口腔没有在饮食后30分钟清洁就会逐渐转化为酸性环境(PH值约5.5)&#x…

python类汇总_Python 类总结

Python可以继承多个父类,多重继承。类支持多个对象的产生,命名空间的继承,运算符重载1)、类产生多个实例对象Python OOP模型中的两种对象:类对象和实例对象。类对象提供默认的行为,是实例对象的工厂。实例对象是程序处…

matlab ,python,c++关于格式化输出数字的表达

我们想要格式化输出1,2,3,...为001,002,003 ... 那么在matlab,python,c该如何表达呢? matlab: >> filedirsprintf(%03i,10)filedir 010 or >> imagenamenum2str(10,%03d)imagename 010 python: index_str %03d % 10index_str Ou…

读取Exchange的用户未读邮件数的几种方法

【http://www.cnblogs.com/nbpowerboy/p/3539422.html】 可以使用ExchangeServiceBinding获取邮件,他相当于outlook, 来获取服务器的未接受的邮件. 至于 “该帐户无权模拟所请求的用户 ” ,是由于在exchange服务器上面没有配置模拟账户. 需要在Exchange Management …

IOS第七天(2:UiTableView 加上数据分离)

****加上数据分离 #import "HMViewController.h" #import "HMStudent.h"interface HMViewController () <UITableViewDataSource> property (weak, nonatomic) IBOutlet UITableView *tableView;/** 数据列表 */ property (nonatomic, strong) NSArr…

观点:Linux 上的杀毒软件

刚刚进入二月&#xff0c;在360安全卫士 for Linux瞬间更名为360安全卫士国产系统专版。紧接着不久&#xff0c;Dr.Web 宣布发现一款可能源自 ChinaZ 的 Linux 系统的后门程序。加之又被朝内媒体炒作起来的 OpenSSL 基金会事宜&#xff0c;不由得思绪飘溢&#xff0c;再看看 Li…

使用opencv的LBF算法进行人脸关键点检测

首先下载最新的opencv 和opencv_contrib, 然后按照在Windows下编译扩展OpenCV 3.1.0 opencv_contrib的方法进行编译&#xff0c;其中核心一点就是先编译opencv&#xff0c;再在OPENCV_EXTRA_MODULES_PATH中加入opencv_contrib的modules的路径。 编译好了后就可以进行人脸关键…

scala case class 继承_数字硬件系统设计之一:Scala快速入门(2)

原想简单笼统介绍一下scala&#xff0c;后感觉这么做意思不大&#xff0c;网友看了和没看一样&#xff0c;还是应该稍微详细具体一点&#xff0c;故而把系列编号由(上)(中)(下)&#xff0c;改为(上)(2)(3)(4)(5)....,(上)就是(1)吧&#xff0c;以下内容部分节选于我们即将出版的…

Ubuntu下安装FTP服务及使用(VSFTPD详细设置)(二)

vsftpd 作为一个主打安全的FTP服务器&#xff0c;有很多的选项设置。下面介绍了vsftpd的配置文件列表&#xff0c;而所有的配置都是基于vsftpd.conf这个配置文件 的。本文将提供完整的vsftpd.conf的中文说明。学习本文的内容将有助于你初步了解vsftpd的配置文件&#xff0c;但针…

crontab命令

前一天学习了 at 命令是针对仅运行一次的任务&#xff0c;循环运行的例行性计划任务&#xff0c;linux系统则是由 cron (crond) 这个系统服务来控制的。Linux 系统上面原本就有非常多的计划性工作&#xff0c;因此这个系统服务是默认启动的。另外, 由于使用者自己也可以设置计划…

调查显示企业对 Linux 开发人才需求日渐增长

根据2014年Linux就业报告调查显示&#xff0c;随着Linux平台增长&#xff0c;Linux平台开发者就业需求较去年提升了7%&#xff0c;技术公司招聘Linux开发经历的人才需求达到 77%&#xff0c;这是来自Dice和Linux基金会共同对就业市场对Linux人才的全景式调查&#xff0c;调查访…

求圆和椭圆上任意角度的点的坐标

圆上任意角度的点的坐标 如上图&#xff0c;给定圆心&#xff08;Cx,Cy&#xff09;,半径为R&#xff0c; 求θ\thetaθ对应的点的坐标&#xff1f; 此处θ\thetaθ是相对于水平轴的角度。 显然我们可以使用极坐标转换来求&#xff1a; {pxCxRcos(θ)pyCyRsin(θ)\left\{\begi…

BZOJ ac100题存档

不知不觉AC100题了&#xff0c;放眼望去好像都是水题。在这里就做一个存档吧&#xff08;特别感谢各位大神尤其是云神http://hi.baidu.com/greencloud和丽洁姐http://wjmzbmr.com/的blog提供的题解&#xff09; 代码什么的有时间在放。 1000: AB Problem 好吧&#xff0c;这也算…

Android Build.VERSION.SDK_INT兼容介绍

尽管Android向下兼容不好&#xff0c;但是一个程序还是可以在多个平台上跑的。向下兼容不好&#xff0c;接口改变&#xff0c;新的平台上不能用旧的API&#xff0c;旧的平台更不可能用新的API&#xff0c;不等于一个平台需要一个APK。可以在高SDK上开发&#xff0c;并在程序中作…

smtp中mailfrom是必须的吗_你是住在高层建筑中吗?这是你必须了解的

01PARTONE消防电梯和普通客梯的作用及特点1.消防电梯是在建筑物发生火灾时供消防人员进行灭火与救援使用且具有一定功能的电梯。因此&#xff0c;消防电梯具有较高的防火要求&#xff0c;其防火设计十分重要。2.普通电梯均不具备消防功能&#xff0c;发生火灾时禁止人们搭乘电梯…

c++ 函数的值传递,引用传递 和 引用返回的探索

2019独角兽企业重金招聘Python工程师标准>>> 前言 C的函数参数和返回分为按值传递和按引用传递,应用到类上面,会涉及到类的 赋值操作 复制函数 构造函数 析构函数 虽然java开发了两年,但对我而言c我还只是一个初学者.c还有很多陌生的特性需要自己亲自探索.这里用实际…

GCD的部分总结

GCD是基于C语言的底层API,用Block定义任务用起来非常灵活便捷. GCD的基本思想是就将操作放在队列中去执行 (1)操作使用Blocks定义(2)队列负责调度任务执行所在的线程以及具体的执行时间(3)队列的特点是先进先出(FIFO)的&#xff0c;新添加至对列的操作都会排在队尾关于多线程的…

将bgr彩色矩阵归一化到0-255之间 【RGB image normalization】

参考下面文章&#xff0c;可以使用normalize 函数。 https://blog.csdn.net/kuweicai/article/details/78988886 对于彩色rgb图像&#xff0c;也可以直接使用以上函数, 参考 https://devtalk.nvidia.com/default/topic/1042100/rgb-image-normalization/?offset8 image cv2…

多线程编程2-NSOperation

本文目录 前言一、NSInvocationOperation二、NSBlockOperation三、NSOperation的其他用法四、自定义NSOperation回到顶部前言 1.上一讲简单介绍了NSThread的使用&#xff0c;虽然也可以实现多线程编程&#xff0c;但是需要我们去管理线程的生命周期&#xff0c;还要考虑线程同步…