Lecture 3 (6D-8A): 共享内存编程--Pthread

一. 共享内存编程

1. 多线程容易遇到的问题

  • 同步:不同线程间的数据保持相同。
  • 死锁:线程间数据互相依赖而互相等待。
  • Cache 一致性:不同core之间的数据一致性。

2. 多线程可以通过哪些方式实现:

  • 多线程编译器:OpenMP
  • Unix processes
  • Thread: pthread

3. Process和thread的区别

  • Thread有一些memory content是可以共享的。
  • Linux的process 和thread 几乎没有区别。但是Linux可以通过FLAG定义哪些内容进行共享。
pthread_creat(&thread1,NULL,func1,&arg);
pthread_join(thread1,*status);
func(&arg){
.
.
.
return(*status)
}

二. Pthread

4. pthread的例子

  • pthread传输的是void类型,只能在程序内部cast。
  • pthread 只是生成线程,怎么沟通和控制需要自己通过memory进行。
#include <pthread.h>
#include <stdio.h>
#define NUM_THREADS 5

void *PrintHello(void *threadld){
  long* data = static_cast<long*> threadld;
  printf("Hello World! thread #%ld!\n", *data);
  pthread_exit(NULL);
}

int main(int argc, char *argv[]){
  pthread_t threads[NUM_THREADS];
  for(long tid=0;tid<NUM_THREADS;tid++){
       pthread_create(&threads[tid],NULL,PrintHello,(void*)&tid);
  }
  pthread_exit(NULL);
}

5. Pthread Joining & Detaching

  • join和detach必须二选一。

  • pthread_join(threadId, status)

    • 一直等到特殊的threadId 线程结束,拿到特殊thread的返回值。
    • 线程间同步
  • pthread_detach(threadId)

    • 一旦一个线程detached,就永远不可能joined
    • detach a thread 会释放一些系统资源。

6. 同步问题

  • 寄存器初始值为5:
producer: move ax, counter      -> ax=5
producer: add ax, 1                   -> ax=6
context switch
consumer: move bx, counter     ->bx =5
consumer: sub bx, 1                  ->bx =4
context switch
producer: move counter, ax       -> counter =6
context switch
consumer: move counter, bx     ->counter =4
  • conter的值有可能是4,或6,或5
  • 正确的值应该是5.

6.1 Pthread

  • Critical Section 临界区
    • 这段代码只能同时被一个process/thread介入。
  • Mutual exclusion 互斥
    • 保证只有一个process/thread 可以在in a critical section
  • Lock: 一种简单的实现方式去保证临界区的互斥。
while (lock == 1); lock = 1;
.
critical section
. lock = 0;
/* no operation in while loop */ /* enter critical section */
/* leave critical section */

Pthread Lock/ Mutex Routines

  • “mutex” 是Pthreads 实现lock的变量
  • 最重要的是需要自己判断哪段代码是shared_memory,把这段代码放入互斥区。
  • mutex的变量类型:pthread_mutex_t
  • pthread_mutex_init()
  • mutex必须销毁:pthread_mutex_detroy()
  • 临界区 可以被两个函数保护:
    • pthread_mutex_lock(&mutex);
    • pthread_mutex_unlock(&mutex);
#include "pthread.h"
pthraed_mutex_t mutex;        
pthread_mutex_init(&mutex, NULL);
pthread_mutex_lock(&mutex); 
        Critical Section
pthread_mutex_unlock(&mutex);
pthread_mutex_detroy(&mutex);

Bounded-buffer Problem

  • 一个有n 个buffer的池子,每个buffer保存一个元素。

  • Producer 生产者:

    • 找到一千个空的buffer
    • 写入一个元素到buffer中
    • 如果没有空的buffer,等待
  • Consumer

    • 找到一个buffer并收回空间
    • 把buffer放回到free pool中
    • 如果所有buffer是空的,等待。

Condition Variable (CV)

  • CV 代表一些condition:
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 进行孤儿与僵尸[https://www.jianshu.com/p/d5c5169f5ded] 1- 应用层pth...
    xuefeng_apple阅读 892评论 0 0
  • 线程概念 利用线程的意义 Advantages of using threadthread reduce the ...
    山中散人的博客阅读 1,067评论 1 2
  • 10.1 引言 在前面的章节中讨论了进程,学习了UNIX进程的环境、进程间的 关系以及控制进程的不同方式。可以看到...
    MachinePlay阅读 549评论 0 0
  • 线程 在linux内核那一部分我们知道,线程其实就是一种特殊的进程,只是他们共享进程的文件和内存等资源,无论如何对...
    大雄good阅读 717评论 0 2
  • 渐变的面目拼图要我怎么拼? 我是疲乏了还是投降了? 不是不允许自己坠落, 我没有滴水不进的保护膜。 就是害怕变得面...
    闷热当乘凉阅读 4,502评论 0 13

友情链接更多精彩内容