美文网首页linux深入
Lecture 3 (6D-8A): 共享内存编程--Pthre

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

作者: Catherin_gao | 来源:发表于2020-11-08 21:24 被阅读0次

一. 共享内存编程

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:

相关文章

  • GoLang并发编程3

    并发编程有两个模式 共享内存 消息 共享内存,以C语言举例 换成 GoLang

  • go并发通信

    go并发编程时,请记住:“不要通过共享内存来通信,而应该通过通信来共享内存” channel是Go语言在语言级别提...

  • linux -11-IPC(共享内存和消息队列)

    XSI IPC之共享内存 和 消息队列(有固定的套路) 共享内存/消息队列/信号量集 遵循相同的规范,因此编程上有...

  • OpenMP 共享内存编程

    梯形积分法 菜包的总结 首次撸OpenMP示例程序,==关键问题在于C语言的语法及基础知识的不足;其次对于Open...

  • java内存模型

    java内存模型基础 并发编程,两个关键问题:线程通信和线程同步通信机制:共享内存和消息传递 java并发采用共享...

  • 2.Java内存模型

    1.java并发编程的线程间通信及线程间如何同步线程间通信分为:共享内存,消息传递。线程间同步:共享内存是代码指定...

  • java内存模型

    java内存模型的基础 并发编程模型的两个关键问题 线程之间如何通信 共享内存:线程之间共享程序的公共状态,通过写...

  • 雅思阅读笔记(第三节)

    curriculum 课程大纲: Lecture 1 总纲、单词题 Lecture 2 句子题 Lecture 3...

  • 雅思阅读笔记(第一节)

    curriculum 课程大纲: Lecture 1 总纲、单词题 Lecture 2 句子题 Lecture 3...

  • 雅思阅读笔记(第二节)

    curriculum 课程大纲: Lecture 1 总纲、单词题 Lecture 2 句子题 Lecture 3...

网友评论

    本文标题:Lecture 3 (6D-8A): 共享内存编程--Pthre

    本文链接:https://www.haomeiwen.com/subject/gymrbktx.html