学习线程

线程认识:
首先 Linux 并不存在真正的线程,Linux 的线程是使用进程模拟的。
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进
程是系统进行资源分配和调度的一个独立单位.
线程是进程的一个实体,是 CPU 调度和分派的基本单位,它是比进程更小
的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点
在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与
同属一个进程的其他的线程共享进程所拥有的全部资源.
线程与进程的区别:
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有
独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影
响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变
量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,
所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较
大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
1) 简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
2) 线程的划分尺度小于进程,使得多线程程序的并发性高。
3) 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,
从而极大地提高了程序的运行效率。
4) 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序
运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必
须依存在应用程序中,由应用程序提供多个线程执行控制。
5) 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部
分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,
来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
使用线程的理由:
使用多线程的理由之一是和进程相比,它是一种非常”节俭”的多任务操
作方式,并且它具有更加方便的线程间通信方式。

这里写图片描述

创建线程相当于创建一条新的执行线路,在此新的线程内调用了 func(arg) 。新线
程的属性由 attr 参数来指定。 func 是一个函数,它接收一个指针作为它的参数,并且运行结束后返回一个指针。参数和返回值都被定义为类型为 void *的指针,以允许它们指向任何类型的值。

这里写图片描述
pthread_join 使得调用线程挂起直至由 thread 参数指定的线程终止。如果 retval 不是
null ,钱程的返回值就将存储在由 retval 指向的变量中。当线程终止时, pthread_join 函数返回 0 ,如果有错误发生,则返回一个非零错误代码。如果某线程试图等待一个并不存在的线程、多个线程同时等待一个线程返回或者线程试图等待自己都将导致函数返回一个错误代码。
多个线程在一个单独的进程中运行,共享全局变量,因此线程间可以通过设置和读取这些全局变量来进行通信。不过要知道,对共享内存的访问可是线程的一个既有用又极为危险的特性。
这里写图片描述

pthreat_mutex_lock用于锁住指定的互斥量

这里写图片描述
频繁的访问互斥量会使得程序的效率变低,一种改善方法是为每个线程设置计时器。比如给线程传递一个结构体指针,分别完成它们自己的功能。传递本 地 结构体指针的方法既避免了对互斥量的依赖,又消除了全局变量。因为结构体是 mam 中的局部变量,所以分配给各计数器的内存空间在 mam 函数返回前一直保存着 。

总结:
进程的数据空间包含了所有属于它的变量 。 此 进程中运行的所有线程都拥有对这些变量访问的权限。如果这些变量值不变的话,线程可以无误地 读取并使用它们的值。如果进程中的任何线程修改了一个变量值,所有使用此变量的线程必须采用某种策略来避免访问冲突 。 在某一时刻,只有惟一的线程可以对变量进行访问
原线程不应在其他线程返回之前读取它们各自计数器的内容。原线程使用
pthread_join 函数使自己挂起直到线程已返回。当某一计数线程返回的时候,对于 pthread_join 的调用激活原线程,允许其访问计数器并且也告诉 main 函数该是读取计数器值的时候了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值