多线程编程:互斥

多线程共享一个进程的地址空间虽然线程间通信容易进行,但是多线程同时访问共享对象时需要引入同步和互斥机制。

1.线程间的互斥,引入互斥锁的目的是用来保证共享资源数据操作的完整性。
互斥锁主要用来保护临界资源,每个邻界资源都由一个互斥锁来保护,任何时刻最多只能有一个线程能访问该资源。线程必须先获得互斥锁才能访问临界资源,访问完临界资源后释放该锁。如果无法获得锁,线程会阻塞知道获得锁为止。

2同步指的是多个任务按照约定的顺序相互配合完成一件事情,

  1 #include<stdio.h>
  2 #include<pthread.h>
  3 int g_count=0;
  4 void* pthread_run(void* arg)
  5 {
  6     int count=5000;
  7     int tmp;
  8     while(count--)
  9     {
 10         tmp=g_count;
 11         printf("pthread_id:%d ,g_count: %d\n",(int)arg,tmp);
 12         g_count=tmp+1;
 13     }
 14     return (void*)0;
 15 }
 16 int main()
 17 {
 18     pthread_t tid1,tid2;
 19     pthread_create(&tid1,NULL,pthread_run,(void*)1);
 20     pthread_create(&tid2,NULL,pthread_run,(void*)2);
 21     sleep(1);
 22     printf("finally,g_count:  %d\n",g_count);
 23     return 0;
 24 }

按照预期结果,应该打印出10000,把g_count加10000次

但是,

这是因为两个线程同时对全局变量进行操作时产生干扰。

多线程的互斥操作主要用互斥量来实现,保护临界资源,对临界区加锁。

#include <pthread.h>

int pthread_mutex_destroy(pthread_mutex_t *mutex);

int pthread_mutex_init(pthread_mutex_t *restrict mutex,

const pthread_mutexattr_t *restrict attr);//attr一般使用默认值为NULL

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

加锁,去锁函数

#include <pthread.h>

int pthread_mutex_lock(pthread_mutex_t *mutex);//阻塞式

int pthread_mutex_trylock(pthread_mutex_t *mutex);//非阻塞式

int pthread_mutex_unlock(pthread_mutex_t *mutex);

实现加锁

  1 #include<stdio.h>
  2 #include<pthread.h>
  3 pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
  4 int g_count=0;
  5 void* pthread_run(void* arg)
  6 {
  7     int count=5000;
  8     int tmp;
  9     while(count--)
 10     {
 11         pthread_mutex_lock(&mutex);
 12         tmp=g_count;
 13         printf("pthread_id:%d ,g_count: %d\n",(int)arg,tmp);
 14         g_count=tmp+1;
 15         pthread_mutex_unlock(&mutex);
 16     }
 17     return (void*)0;
 18 }
 19 int main()
 20 {
 21     pthread_t tid1,tid2;
 22     pthread_create(&tid1,NULL,pthread_run,(void*)1);
 23     pthread_create(&tid2,NULL,pthread_run,(void*)2);
 24     sleep(1);
 25     pthread_mutex_destroy(&mutex);
 26     printf("finally,g_count:  %d\n",g_count);
 27     return 0;
 28 }

总结:加锁时应该考虑问题的规模选择加锁的粒度,应从安全,性能,稳定性三方面来考虑。

加锁时,粒度越大,申请锁的次数少,申请锁时会占代码资源;

加锁加的越早,并行性能降低,程序执行效率也随之降低。

时间: 2024-08-01 00:38:00

多线程编程:互斥的相关文章

Linux多线程编程-互斥锁

互斥锁 多线程编程中,(多线程编程)可以用互斥锁(也称互斥量)可以用来保护关键代码段,以确保其独占式的访问,这有点像二进制信号量.POSIX互斥锁相关函数主要有以下5个: #include <pthread.h> int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr); int pthread_mutex_destroy(pthread_mutex_t *mutex); int p

Linux多线程编程-条件变量

条件变量 如果说线程间的互斥锁是用来同步共享数据的访问的话,那么条件变量是用于线程之间共享数据的值.条件变量提供了一种线程之间的通知机制,当某个共享数据达到某个值时,唤醒等待这个共享数据的线程.条件变量相关函数主要 有5个: #include <pthread.h> int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *cond_attr); int pthread_cond_destroy(pthread_

C++11多线程编程之互斥量

+(UIImage*)createImageFromView:(UIView*)view { //obtain scale CGFloat scale = [UIScreen mainScreen].scale; 开始绘图,下面方法,第一个参数表示区域大小.第二个参数表示是否是非透明的.如果需要显示半透明效果,需要传NO,否则传YES.第三个参数就是屏幕密度了 UIGraphicsBeginImageContextWithOptions(CGSizeMake(view.frame.size.wi

多线程编程之互斥量

最近在看POSIX多线程编程,想把自己看完之后还记得的只言片语记录一下,加深记忆. 如果多个线程对同一个内存区域进行读写操作,可以使用互斥锁保证某个线程对该内存的操作具有原子性. 使用多线程是为了使程序的运行达到并发甚至并行的目的,互斥锁的使用使多个线程在临界区只能一个一个的运行. 临界区是指操作全局内存区域的那一块代码段. 互斥量的初始化: pthread_t mutex = PTHREAD_MUTEX_INITIALIZER;  静态初始化 pthread_mutex_init();动态初始

转载自~浮云比翼:Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)

Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥) 介绍:什么是线程,线程的优点是什么 线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可以看作是Unix进程的表亲,同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等.但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage). 一

【C/C++多线程编程之六】pthread互斥量

多线程编程之线程同步互斥量  Pthread是 POSIX threads 的简称,是POSIX的线程标准. Pthread线程同步指多个线程协调地,有序地同步使用共享资源.[C/C++多线程编程之五]pthread线程深入理解中讲述到,多线程共享进程资源,一个线程访问共享资源需要一段完整地时间才能完成其读写操作,如果在这段时间内被其他线程打断,就会产生各种不可预知的错误.协调线程按一定的规则,不受打扰地访问共享资源,保证正确性,这便是线程同步的出发点.        互斥量,是最简单的线程同步

python多线程编程(2): 使用互斥锁同步线程

上一节的例子中,每个线程互相独立,相互之间没有任何关系.现在假设这样一个例子:有一个全局的计数num,每个线程获取这个全局的计数,根据num进行一些处理,然后将num加1.很容易写出这样的代码: # encoding: UTF-8import threadingimport time class MyThread(threading.Thread): def run(self): global num time.sleep(1) num = num+1 msg = self.name+' set

Linux程序设计学习笔记----多线程编程线程同步机制之互斥量(锁)与读写锁

互斥锁通信机制 基本原理 互斥锁以排他方式防止共享数据被并发访问,互斥锁是一个二元变量,状态为开(0)和关(1),将某个共享资源与某个互斥锁逻辑上绑定之后,对该资源的访问操作如下: (1)在访问该资源之前需要首先申请互斥锁,如果锁处于开状态,则申请得到锁并立即上锁(关),防止其他进程访问资源,如果锁处于关,则默认阻塞等待. (2)只有锁定该互斥锁的进程才能释放该互斥锁. 互斥量类型声明为pthread_mutex_t数据类型,在<bits/pthreadtypes.h>中有具体的定义. 互斥量

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

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