线程概念及线程的同步与互斥

线程概念:它是运行在进程内部的的一个基本执行流,多线程的控制流程可以长期并存,一个进程中的数据段和代码段都是被该进程中的多个线程共享的,若定义一个函数,每个线程都可以调用,若定义一个全局变量,每个线程都可以访问。

线程还共享进程的以下内容:1.文件描述符表 2.当前的工作目录 3.用户id(uid)和组id(gid) 4.每种信号的处理方式。

但每个线程还必须有自己的私有部分:1.线程id 2.硬件上下文(硬件寄存器的值,栈指针等) 3.自己的栈空间(运行时的临时数据都要保存在自己的栈空间上) 4.信号屏蔽字(可以进行有选择的的对某些操作进行屏蔽) 5.调度优先级(决定哪个线程优先被调用)6.errno变量

线程与进程的异同:1)进程强调独占资源,而线程强调共享,但线程自己也有自己独立的资源。2)进程之间的通信,共享以及进程之间切换成本大,而线程之间的切换的成本就很小了。3)进程是并发执行的程序在执行过程中分配和管理资源的基本单位(即是承担和分配系统资源的一个基本实体),而线程是实现调度的一个基本实体。4)进程拥有自己独立的虚拟地址空间,而线程是进程中的一个分支,没有自己的地址空间,与进程中的其他线程共享其进程的地址空间。

线程的同步与互斥:

互斥:当多个线程同时读写同一份共享资源的时候,但有些资源只能允许一个线程访问,这就可能会引起冲突。

举个列子:车站售票,当多个售票员同时对车票数据库进行操作时,售出一张车票总数-1,如果同时多个售票员同时进行售票,系统将数据进行-1操作,就出现了错误。

线程同步:一般来说一个线程相对于另一个线程的运行速度是不确定的,即线程在异步环境下运行的,每个线程都会以不可预知的速度推进,但是相互合作的线程需要在某个定点上进行协同合作,当一个线程到达了这些点后,除非另一个线程已经完成了某个操作,否则就必须停下来等待别的线程来完成这些操作

POSIX标准下函数名中以下划线为分隔符

线程的创建:pthread_create(pthread_t *thread,const pthread_attr_t *attr,void*(*start routine)(void *),void *arg);//thread->线程id;attr->线程属性(一般使用线程默认的);void*(*start routine)(void*)->函数指针指向参数为void *函数返回值也为void* 类型的指针;void* arg->传递给线程的参数

pthread.h  创建了三个线程,一个主线程,以阻塞方式等待线程退出





让三个线程依次进行创建结果:线程一创建完并释放后线程二创建,之后线程三创建,会出现段错误

若三个线程同时创建:

四种终止线程方式:

1.线程主动终止自己

2.调用pthread_exit(void* retval)函数

3.用return在线程中返回

4.被其他线程取消

时间: 2024-12-26 09:14:54

线程概念及线程的同步与互斥的相关文章

python全栈开发,Day41(线程概念,线程的特点,进程和线程的关系,线程和python理论知识,线程的创建)

昨日内容回顾 队列 队列:先进先出.数据进程安全 队列实现方式:管道+锁 生产者消费者模型:解决数据供需不平衡 管道 双向通信,数据进程不安全 EOFError: 管道是由操作系统进行引用计数的 必须在所有进程中关闭管道后才能生成EOFError异常 数据共享(不常用) Manager list dict 数据进程不安全的 进程池 存放进程的容器 在进程创建之初,创建固定个数的进程 会被多个任务循环利用 节省了进程创建和销毁的时间开销 降低了操作系统调度进程的压力 信号量和进程池的区别 信号量:

Linux多线程编程——线程的同步与互斥

前言:无论是多线程编程还是多进程编程,控制好不同线程或不同进程之间同步和互斥问题是非常有必要的.同步是多个进程或线程共同完成某个任务,举例说,一个缓冲区的生产者和消费者问题,当生产者生产了一个商品时,等待的消费者就获得了一个消息知道可以去取走商品了,当消费者取走一个商品后,生产者就知道可以继续生产一个商品了,这是同步问题,所谓互斥问题,是指某个共享资源在一次操作中,只能被一个线程或进程占有,其他的线程或进程不能对它进行操作,比如对一个共享内存的读写操作,当一个进程对它写的时候,另一个进程就不能对

[linux]进程(八)---线程概念

线程 概念:线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),进程的所有信息对该进程的所有线程是共享的,包括程序文本,程序的全部内存,堆,栈和文件描述符. 线程标识:进程ID在整个系统中是唯一的,用pid_t数据类型表示,线程ID只在它所属的进程环境中有效,用pthread_t数据类型表示,用 pthread_t pthread_self(void):来获得自身线程ID. 1 #include <stdio.h> 2 #include <st

Java深度历险(三)——Java线程?:基本概念、可见性与同步

开发高性能并发应用不是一件容易的事情.这类应用的例子包括高性能Web服务器.游戏服务器和搜索引擎爬虫等.这样的应用可能需要同时处理成千上万个请求.对于这样的应用,一般采用多线程或事件驱动的架构.对于Java来说,在语言内部提供了线程的支持.但是Java的多线程应用开发会遇到很多问题.首先是很难编写正确,其次是很难测试是否正确,最后是出现问题时很难调试.一个多线程应用可能运行了好几天都没问题,然后突然就出现了问题,之后却又无法再次重现出来.如果在正确性之外,还需要考虑应用的吞吐量和性能优化的话,就

Android多线程研究(3)——线程同步和互斥及死锁

为什么会有线程同步的概念呢?为什么要同步?什么是线程同步?先看一段代码: package com.maso.test; public class ThreadTest2 implements Runnable{ private TestObj testObj = new TestObj(); public static void main(String[] args) { ThreadTest2 tt = new ThreadTest2(); Thread t1 = new Thread(tt,

线程同步(互斥锁与信号量的作用与区别)

“信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在semtake的时候,就阻塞在 哪里).而互斥锁是用在多线程多任务互斥的,一个线程占用了某一个资源,那么别的线程就无法访问,直到这个线程unlock,其他的线程才开始可以利用这 个资源.比如对全局变量的访问,有时要加锁,操作完了,在解锁.有的时候锁和信号量会同时使用的” 也就是说,信号量不一定是锁定某一个资源,而是流程上的概念,比如:有A,B两个线程,B线程要等A线程完成某一任务以后

线程的同步和互斥

1.基本概念 同步:指定线程的执行顺序,比如有两个线程A,B都要访问资源的时候,B执行了途中需要A的结果,所以B先让出资源,等A执行结束后再执行B 互斥:多个线程访问系统资源的时候,同时只能有一个线程对资源进行访问 2.线程间的同步和互斥是通过操作系统中信号量和PV原语来实现的 PV操作是由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下: P(S):①将信号量S的值减1,即S=S-1: ②如果S³0,则该进程继续执行:否则该进程置为等待状态,排入等待队列. V

Linux之线程:同步与互斥

首先我们来说一下同步是什么: 其实所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回,同时其它线程也不能调用这个方法.按照这个定义,其实绝大多数函数都是同步调用(例如sin, isdigit等).但是一般而言,我们在说同步.异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务.例如Window API函数SendMessage.该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回.当对方处理完毕以后,该函数才把消息处理函数所返回的LRESULT值返回给

Linux环境下线程的同步与互斥以及死锁问题

由于本次要讨论操作系统的死锁问题,所以必须先研究的是linux环境下的线程同步与互斥 先看下面的代码 大家猜想输出应该是什么呢? 结果是下面这个样子 好吧,似乎并没有什么区别... 那么下面再看这段代码(请无视并忽略屏蔽的内容...) 大家猜想正确的结果是什么呢?5000,10000? 好吧,或许你们都错了. 在运行了一段时间后,它的结果是这样的. 是不是又对又错? 为什么呢? 这就是因为程序中printf语句作用:本身是库函数,所以必须进行系统调用,必须进入内核进行切换,有很大概率形成数据的混