Linux多线程编程

  • 一、线程理论基础
  • 二、多线程程序设计
    • 1.创建线程
    • 2.线程退出
    • 3.线程等待
    • 4.创建线程的代码练习
  • 三、线程==同步==(按顺序)
    • 1.互斥量
      • a)创建互斥量
      • b)初始化互斥量
      • c)上锁
      • d)解锁
      • e)销毁互斥锁
    • 2.条件变量
  • 网络编程
    • 1.协议栈

一、线程理论基础

有了进程,为何还要引入线程呢?使用多线程有哪些好处?

1、和进程相比,线程是一种非常节俭的多任务操作方式,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表维护它的代码段、堆栈段、数据段,这是一种昂贵的多任务工作方式
运行于一个进程中的多线程,它们之间使用相同的地址空间,而且线程间彼此切换所需的时间也远远小于进程间切换所需要的时间

2、线程间方便的通讯机制,对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过进程间通信的方式进行,这种方式不仅费时,而且很不方便。线程则不然,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便

3.除了以上说的有点外,多线程程序作为一种多任务、并发的工作方式,有如下优点:
使用CPU系统更加高效,操作系统会爆炸当线程数不大于CPU数码时,不同的线程运行与不同的CPU上
改善程序结构,一个既长又复杂的进程可以考虑分为多线程,称为几个独立或半独立的运行部分,这样的程序会利于理解和修改

Linux系统下的多线程遵循POSIX线程接口,称为pthread。编写Linux下的多线程程序,需要使用头文件pthread.h,连接(编译)时需要加libpthread.a

二、多线程程序设计

创建线程时候一系列参数传递
首先创建线程成功后 会立马调用创建函数第三个参数即线程的工作函数
此时如果线程有参数要传递给工作函数 可用第四个参数
工作函数完成以后 主要有两种退出方式 1)使用pthread_exit()函数 此时会将()中的值传递给主线程中的join()函数第二个参数
2)使用return (void)8 会将8传递给join()函数第二个参数*

1.创建线程

函数返回值代表成不成功
第一个参数是指针 会带回线程的ID
第三个参数是一个指向函数的指针 所以赋函数名
创建一旦成功 会立刻执行第三个函数的功能 此时就是两个线程并发的执行
如果主线程要传值给子线程函数 就写第四个参数

2.线程退出


线程退出可以使用上面的函数 而这个函数()中的参数就是传递给join函数的第二个参数的

线程退出也可以return 但要记得要转换为(void*)

3.线程等待

第二个参数 是子线程工作函数的返回值

4.创建线程的代码练习

#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include<string.h>
#include<unistd.h>char mem[] = "hello world";//全局变量void * thread_work(void * arg){//子线程的工作函数 arg是子线程传给工作函数的值printf("child thread running .. get arg is %s\n",(char *)arg);//输出参数sleep(3);strcpy(mem,"bye");//对全局变量操作pthread_exit("thanks for you cup time!\n");//退出子线程 并将括号中的字符串传给join函数
}int main(){pthread_t tid;//线程IDint ret;void *thread_rel;//存放jion函数得到的返回值ret = pthread_create(&tid,NULL,thread_work,(void *)mem);//创建线程if(ret != 0){perror("create thread error!");exit(-1);}printf("father thread waiting...\n");pthread_join(tid,&thread_rel);//等待子线程结束printf("father thread joined get thread_rel is %s\n",(char *)thread_rel);//输出子线程传递的参数printf("select share men is %s\n",mem);//输出共享变量 即全局变量return 0;
}

三、线程同步(按顺序)

进行多线程编程,因为无法知道哪个线程会在哪个时候对共享资源进行操作,因此让如何保护共享资源变得复杂,通过下面这些技术的使用,可以解决
线程之间对资源的竞争:

a)互斥量Mutex
b)信号灯Semaphore
c)条件变量Conditions

1.互斥量

为什么要使用互斥量?

当一个线程在使用共享变量即全局变量时 无法进行独占 从而会导致一系列问题

对于这种情况,系统给我们提供了互斥量,线程在取出头结点前必须要等待互斥量,如果此时有其他线程已经获得该互斥量,那么该线程将会阻塞在这里,只有等到其他线程释放掉该互斥量后,该线程才有可能得到该互斥量,互斥量从本质上说就是一把锁,提供对共享资源的保护访问

a)创建互斥量

创建语句 pthread_mutex_t lock;
创建lock锁成功
强调!!! 创建互斥锁是在所有函数外部 一定要将互斥锁设为全局变量 因为其也是共享资源

b)初始化互斥量

创建互斥量成功后 在主线程中进行初始化 一般使用动态初始化
pthread_mutex_init(&lock,NULL)第二个参数NULL表示普通锁

强调!!!所有参数都要取地址 因为函数参数是指针

第一个参数放互斥锁的地址
第二个参数 指定互斥锁的属性 一般情况下 写NULL 表示默认属性
锁值的属性有PTHREAD_MUTEX_TIMED_NP这是默认属性 这个锁是普通锁 同一个线程只能锁一次
第二个属性有PTHREAD_MUTEX_RECURSIVE_NP允许**同一个**线程对资源多次上锁 多次上锁必须多次解锁
第三个属性PTHREAD_MUTEX_ERRORCHECK_NP检测锁 不允许多次锁 会报错
第四种属性PTHREAD_MUTEX_ADAPTIVE_NP等待解锁以后给其余线程竞争
初始化失败返回-1 成功返回0

c)上锁

在线程工作函数需要使用共享资源 则在使用之前上锁
pthread_mutex_lock(&lock)

lock是阻塞等待
trylock是非阻塞等待 这时没有锁成功 返回值是-1

d)解锁

在操作完成后,必须给互斥量解锁也就是前面所说的释放。这样其他等待该锁的线程才有机会获得该锁,否则其他线程将会永远阻塞
解锁:pthread_mutex_unlock(&lock)

e)销毁互斥锁

互斥锁是一个共享变量(全局变量)
销毁:pthread_mutex_destroy(&lock)

2.条件变量

当使用互斥锁时 形成了死锁解不开时 需要条件变量从中调解 解除死锁状态
何为死锁 条件变量如何工作 例如:

当消费者要在货架上买东西 当消费者线程工作函数进行买之前要将共享资源 货架 锁起来
所以对其上锁 锁好后 要判断条件 货架有没有货 当有货时 条件满足 执行买的操作 操作完成后解锁 让生产者往货架上放东西
然而如果上锁后发现 货架为空 那么条件不满足 买不了东西 自然解不了锁 那么就会进入死锁状态
这时候 条件变量其效果 pthread_cond_wait(&cond,&lock)
这个函数 会悄悄的将锁解开 然后开始等待 等待其他线程去拿锁 然后工作 工作完成后 会给这个函数发送一个信号 收到货架不空的信号后 wait函数会将共享资源锁住给消费者工作函数使用 这时候 条件满足 锁也上了 可以执行买的操作 然后解锁 当然这时候要给别的线程的条件变量wait函数发送信号 货架不满的信号 因为 生产者也可能会进入死锁 也可能需要条件变量来调解

条件变量的创建 初始化 与互斥量差不多


wait函数会在等待过程中将锁解开 然后等待条件成立 条件成立后再上锁


给其他条件变量发送信号

网络编程

1.协议栈

Linux的有点之一就是在于它丰富而稳定的网络协议栈,其范围是从协议无关层(如通用的socket)


七层的主要功能有什么 有哪些协议

Linux多线程编程相关推荐

  1. ZT 为什么pthread_cond_t要和pthread_mutex_t同时使用 || pthread/Linux多线程编程

    为什么线程同步的时候pthread_cond_t要和pthread_mutex_t同时使用 (2009-10-27 11:07:23) 转载▼ 标签: 杂谈 分类: 计算机 举一个例子(http:// ...

  2. linux查询某域线程是否满了,Linux多线程编程的时候怎么查看一个进程中的某个线程是否存活...

    pthread_kill: 别被名字吓到,pthread_kill可不是kill,而是向线程发送signal.还记得signal吗,大部分signal的默认动作是终止进程的运行,所以,我们才要用sig ...

  3. linux线程 ppt,Linux多线程编程多核编程.ppt

    <Linux多线程编程多核编程.ppt>由会员分享,可在线阅读,更多相关<Linux多线程编程多核编程.ppt(28页珍藏版)>请在装配图网上搜索. 1.Linux多线程编程, ...

  4. 多核程序设计 linux,多核程序设计Linux多线程编程.ppt

    Linux多线程编程,IEEE POSIX 标准 p1003.1c (Pthreads) 定义了处理线程的一系列C 语言类型的API. 在Linux中,线程一般被认为是"轻量级的进程&quo ...

  5. Linux 多线程编程(实现生产者消费者模型)

    Linux 多线程编程 线程分类 线程按照其调度者可以分为用户级线程和内核级线程两种. 内核级线程 在一个系统上实现线程模型的方式有好几种,因内核和用户空间提供的支持而有一定程度的级别差异.最简单的模 ...

  6. Linux多线程编程---线程间同步(互斥锁、条件变量、信号量和读写锁)

    本篇博文转自http://zhangxiaoya.github.io/2015/05/15/multi-thread-of-c-program-language-on-linux/ Linux下提供了 ...

  7. c/c++ Linux多线程编程

    Linux多线程编程 线程概念 线程是指运行中的程序的调度单位.一个线程指的是进程中一个单一顺序的控制流,也被称为轻量级线程.它是系统独立调度和分配的基本单位.同一进程中的多个线程将共享该系统中的全部 ...

  8. Linux多线程编程-互斥锁

    互斥锁 多线程编程中,(多线程编程)可以用互斥锁(也称互斥量)可以用来保护关键代码段,以确保其独占式的访问,这有点像二进制信号量.POSIX互斥锁相关函数主要有以下5个: #include <p ...

  9. Linux 多线程编程

    这篇文章总结下 Linux 中多线程编程中能用到的几个函数,当然,需要同步操作的时候还需要加锁的操作,这里,没有列举的这么具体,只是把最常用的函数介绍下. 在编写多线程程序在编译的时候需要加上 -lp ...

  10. 详解Linux多线程编程

    前言 线程?为什么有了进程还需要线程呢,他们有什么区别?使用线程有什么优势呢?还有多线程编程的一些细节问题,如线程之间怎样同步.互斥,这些东西将在本文中介绍.我在某QQ群里见到这样一道面试题: 是否熟 ...

最新文章

  1. hibernate mysql缓存机制_Hibernate的缓存机制
  2. 云效助力新金融DevOps转型——南京银行实践之路
  3. Mysql 8.0下载与安装详解,并修改安装路径
  4. xcode 4 最低的要求是 10.6.6的版本,如果你是 10.6.3的版本,又不想升级的话。可以考虑通过修改版本号的方法进行安装
  5. win7系统5分钟就会自动注销的解决教程
  6. ModelState用法
  7. html中擦窗效果,纯CSS写的小雨打在窗户上效果
  8. pta-5、产生每位数字相同的n位数 (10 分)
  9. mysql NOW,CURRENT_TIMESTAMP,SYSDATE 之间的区别
  10. js 中的switch
  11. 机器视觉——IC芯片字符检测打光实例
  12. Android内核开发:在源码树中添加新的app应用
  13. php如何使用网关,在某种情况下,由于PHP代码,网关已关闭(Gateway is down because of PHP code in one situation)...
  14. Code Review 效率低?来试试智能语法服务
  15. 钟表维修管理系统技术解析(六) 录入保修单
  16. 罗夏墨迹测验(转载)
  17. http协议相关内容,C/S与B/S,ip报文,TCP,UDP
  18. c语言万能编程模板_8051单片机C语言通用万能编程模板
  19. 计算机水冷排原理,玩转水冷电脑 冷排是关键
  20. torch.squeeze 函数运用

热门文章

  1. 在构建好XPE操作系统上增加EWF功能
  2. 你们要的Android计算器,今天它来了~
  3. 三方支付 微信支付 支付宝支付 银联支付 分享
  4. 【码歌】Java逆袭之路,小白系统笔记,持续更新
  5. 飞行堡垒FX80GM热键无反应与触摸板无法使用
  6. 视频教程-Dubbo视频教程-Java
  7. 发言倒计时器_单面会议计时器 会议发言倒计时器
  8. 《人件》 精华版 为软件企业指明成功之路 为开发人员伸张权益
  9. jsp java 购物车,jsp简单购物车
  10. CUDA C 编程/Nsight可视化