文档章节

Linux Threading 线程

Freewheel
 Freewheel
发布于 2017/04/24 18:01
字数 1091
阅读 51
收藏 1
点赞 0
评论 0

以下是单线程进程和多线程进程在内存方面的模型

即同一进程的线程之间共享一份代码,常量,全局变量和堆变量,但是有各自的本地变量(栈,寄存器)。

 

多线程与多进程的简单比较

数据共享方面:

进程之间无法访问对方的内存,因此需要通过kernel space创建共享对象进行沟通;

线程之间可以通过进程内的全局变量和堆变量进行沟通,更简单高效。(但同样需要解决race condition等同步问题)

 

POSIX thread library 标准线程库

 

pthread_create

int pthread_create( pthread_t *thread, 
                    const pthread_attr_t *attr, 
                    void *(*start_routine) (void *), 
                    void *arg 
                  );

线程的起始函数的参数和返回值都是 void* 类型,因此可以代入所有类型的指针。

传入线程的参数也是个指针,因此该参数的值在main thread 和 new thread 里都可以被更改。

 

pthread_exit

void pthread_exit(void *return_value);

 

pthread_join

int pthread_join(pthread_t thread, void **retval);

 

Pthread Synchronization 线程层面的同步

除了使用semaphore,thread之间的同步还可以使用pthread_mutex 和 Condition Variable。

由于semaphore在使用上(编写代码)比较难,并且可读性比较差(因为功能太强大),更推荐后两者。

 

pthread_mutex 顾名思义专门用于作为互斥锁,通常在声明为全局变量,使用时十分简单

 pthread_mutex_lock(&mutex);
 // ... critical section
 pthread_mutex_unlock(&mutex);

与semaphore不同,pthread_mutex在被获取成功的时候,它就被该线程拥有了;而semaphore则没有被拥有这个概念,它只是在kernel space作为一个第三方的存在。

 

Condition Variable 名称较为歧义,其真实用法主要是通知 notification。

它内部没有变量,计数器等,调用 wait 和 signal 方法都是 atomical 和 stateless的。(优点:性能更好,更新变量是件麻烦的事情。)

signal 方法是无条件的,即任何wait的thread都会被唤醒。因此,wait代码附近常使用 while 循环,加入条件检查代码。

while ( meet_requirement()) {
  cond_wait(&v, &m);
}

 

为什么wait方法的第二个参数是一个pthread_mutex变量?

当thread因为wait进入挂起状态时,必须释放手上的锁,使得别的thread能获得锁并执行任务;

当thread从wait中被唤醒,就需要重新拿回锁。

示例代码:

mutex_lock(&m);
while (x!=y) {
  cond_wait(&v, &m);
}
printf(x/y = 1);
mutex_unlock(&m);

 

Reentrant可重入

reentrant 可重入函数 指即使线程在中途被打断并且从头调用也可以得到正确的答案,无论这个函数之前的调用是否完成。“if it can be interrupted in the middle of its execution, and then be safely called again ("re-entered") before its previous invocations complete execution.”

-- https://en.wikipedia.org/wiki/Reentrancy_(computing)

即可重入的函数不会使用全局变量和静态变量,所有的变量都只跟单次执行有关。因此,可重入函数有益于消除共享状态share state。

 

Thread safety  线程安全

线程安全是指在多线程的环境中能够避免race condition,并且保证数据同步。

实现线程安全的途径之一就是采用可重入的编程方法减少共享状态。

 

CPU atomic instructions

test_and_set() 

//pseudocode (indeed a single atomic instruction)
boolean test_and_set(boolean *target){
  boolean tmp = *target; //original value
  *target = 1; //set
  return tmp; //return the original value!
}

使用 test_and_set 实现 mutex (示例代码,并非真实实现)

局限性: test_and_set 只能同步2个线程(进程)

 

compare_and_swap()

//pseudocode (indeed a single atomic instruction)
int compare_and_swap(int *value, int expected, int new_value) {
    int temp = *value; //original value
    if (*value == expected)
      *value = new_value;
    
    return temp; //return the original value
}

使用compare_and_swap实现mutex (示例代码,并非真实实现)

现在compare_and_swap在底层被大量用来实现semaphores, mutex, lock-free operations

 

几个编程概念

Lock-free programming

Lock-free DSA ensures a high throughput of a system/operation by 
- Guarantee progress for some threads when there are multiple threads 保证部分线程进展
- While any particular thread is blocked/waiting, some other threads must be running in order to make sure all the cores are doing useful work without stalls 保证CPU一直运行,做有用功

名字稍有歧义,Lock-free与实现中是否用到锁无关

 

Wait-free programming

Wait-free DSA ensures a high throughput of a system/operation by
– Guarantee progress for every thread when there are multiple threads without sacrificing latency of a particular thread ( Sometimes impossible to achieve) 保证所有线程都有进展
– Thread1.operation X() must finish in a finite number of steps,regardless of the state/speed of the other thread  保证一个线程操作在有限时间内一定完成

 

 

© 著作权归作者所有

共有 人打赏支持
Freewheel
粉丝 8
博文 83
码字总数 48265
作品 0
普陀
程序员
linux多线程网页截图-python

上一篇中(linux多线程网页截图-shell),使用shell多进程对大量的网站截图,大大减少了截图的时间。但慢慢的也发现了这种方式的弊端:每个进程分配的网站数量是相等的,有些进程截图较快,有...

cszer
2013/06/14
0
1
Python标准库08 多线程与同步 (threading包)

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢! Python主要通过标准库中的threading包来实现多线程。在当今网络时代,每个服务器都会接收到大量的请求...

osDaniel
2014/09/21
0
0
Linux2.6内核和Linux2.4内核有什么不同?

 1.模块子系统(Module Subsystem)、统一设备模型(Unified Device Model)和 PnP 支持模块子系统发生了重大变化。  2.稳定性有所提高   为了彻底避免内核加载或者导出正在被使用的内核...

jtihj
2009/12/20
0
0
processes, threads and signals in Linux

之前想知道process和threads在Linux kernel中的调度问题,后来就想知道linux如何支持multithreaded application了;感谢几位osc的朋友提供的资料和帮助。对于以上两个问题,我了解了个大概。...

ChenQi
2012/04/10
0
2
Python3学习笔记11-标准库之子进程、信号、多线程、进程信息

关于进程与线程的简单理解(以工厂举例:cup-》工厂,车间-》进程,线程-》工人),可以参考阮一峰的博文进程与线程的一个简单图文解释 一、子进程 (subprocess包) 这里的内容以Linux进程基础...

Corwien
2016/06/11
147
0
Python第十三堂课(并发)

一、并发 二、并发的解决 二、进程和线程 三、线程的状态 四、Python中的线程开发 名称含义current_thread( )返回当前线程对象main_thread()返回主线程对象active_count( )当前处于alive状态...

菜鸡满地跑
2017/12/19
0
0
MIPS技术公司官方对linux的支持信息

Linux MIPS Technologies actively supports, develops and improves the Linux kernel for the MIPS® architecture, in particular MIPS Technologies cores, the MIPS32®, microMIPS™ ......

RyaneLuo
2012/07/30
0
0
python之多线程并发处理模块-threading

thread:多线程的底层支持模块,一般不建议使用; threading:对thread进行了封装,将一些线程的操作对象化,一般采用这种方法实现多线程编程 多线程实现有两种模式: 1.创建线程要执行的函数...

zhpfxl
2016/12/27
0
0
Disruptor技术调研之配置参数一览

1、单生产者和多生产者 One of the best ways to improve performance in concurrect systems is to ahere to the Single Writer Princple, this applies to the Disruptor. If you are in ......

nj-zhangmq
2016/04/18
37
0
The C10K problem原文翻译

原文地址:http://www.cnblogs.com/fll/archive/2008/05/17/1201540.html The C10K problem 如今的web服务器需要同时处理一万个以上的客户端了,难道不是吗?毕竟如今的网络是个big place了。...

晨曦之光
2012/03/09
178
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

大数据教程(2.11):keeperalived+nginx高可用集群搭建教程

上一章节博主为大家介绍了目前大型互联网项目的系统架构体系,相信大家应该注意到其中很重要的一块知识nginx技术,在本节博主将为大家分享nginx的相关技术以及配置过程。 一、nginx相关概念 ...

em_aaron
13分钟前
0
0
Apache Directory Studio连接Weblogic内置LDAP

OBIEE默认使用Weblogic内置LDAP管理用户及组。 要整理已存在的用户及组,此前办法是导出安全数据,文本编辑器打开认证文件,使用正则表达式获取用户及组的信息。 后来想到直接用Apache Dire...

wffger
20分钟前
2
0
HFS

FS,它是一种上传文件的软件。 专为个人用户所设计的 HTTP 档案系统 - Http File Server,如果您觉得架设 FTP Server 太麻烦,那么这个软件可以提供您更方便的档案传输系统,下载后无须安装,...

garkey
24分钟前
0
0
Java IO类库之BufferedInputStream

一、BufferedInputStream介绍 /** * A <code>BufferedInputStream</code> adds * functionality to another input stream-namely, * the ability to buffer the input and to * sup......

老韭菜
27分钟前
0
0
STM 32 窗口看门狗

http://bbs.elecfans.com/jishu_805708_1_1.html https://blog.csdn.net/a1985831055/article/details/77404131...

whoisliang
昨天
0
0
Dubbo解析(六)-服务调用

当dubbo消费方和提供方都发布和引用完成后,第四步就是消费方调用提供方。 还是以dubbo的DemoService举例 -- 提供方<dubbo:application name="demo-provider"/><dubbo:registry address="z...

青离
昨天
1
0
iptables规则备份和恢复、firewalld的9个zone以及操作和service的操作

保存以及备份iptalbes规则 设定了的防火墙规则要进行保存,否则系统重启后这些规则就没有了,使用命令 ”service iptables save ” 会把设定好的防火墙规则保存到文件/etc/sysconfig/iptabl...

黄昏残影
昨天
0
0
k8s image

k8s.gcr.io/kube-apiserver-amd64:v1.11.0k8s.gcr.io/kube-controller-manager-amd64:v1.11.0k8s.gcr.io/kube-scheduler-amd64:v1.11.0k8s.gcr.io/kube-proxy-amd64:v1.11.0k8s.gcr.......

分秒
昨天
0
0
数据结构--排序

这篇博客包含了数据结构中多种的排序算法: (1)简单选择:第一趟在A[0]~A[n-1]之间找到最小的,与A[0]进行交换,之后在A[1]~A[n-1]之间进行。。。第i趟在A[i-1]~A[n-1]之间找到最小的,最后...

wangxuwei
昨天
1
0
一名3年工作经验的java程序员应该具备的职业技能

一名3年工作经验的Java程序员应该具备的技能,这可能是Java程序员们比较关心的内容。我这里要说明一下,以下列举的内容不是都要会的东西—-但是如果你掌握得越多,最终能得到的评价、拿到的薪...

老道士
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部