###Date: 2017/11/13
转载自:http://blog.csdn.net/lovecodeless/article/details/24885127
Pthread是 POSIX threads 的简称,是POSIX的线程标准。
Pthread线程同步指多个线程协调地,有序地同步使用共享资源。【C/C++多线程编程之五】pthread线程深入理解中讲述到,多线程共享进程资源,一个线程访问共享资源需要一段完整地时间才能完成其读写操作,如果在这段时间内被其他线程打断,就会产生各种不可预知的错误。协调线程按一定的规则,不受打扰地访问共享资源,保证正确性,这便是线程同步的出发点。
互斥量,是最简单的线程同步机制,也是最常用的同步策略。
1.互斥量(mutex):
互斥量是一种线程同步对象,“互斥”的含义是同一时刻只能有一个线程获得互斥量。一个互斥量对应一个共享资源,互斥量状态:1.解锁状态意味着共享资源可用,2.加锁状态意味着共享资源不可用。
一个线程需要使用共享资源时,使用thread_mutex_lock申请:1.当互斥量为解锁状态,则占用互斥量,并给互斥量加锁,占用资源(互相量为加锁状态,其他线程不能使用互斥量并等待互斥量变为解锁状态),2.如果互斥量为加锁状态,则线程等待,直到互斥量为解锁状态(其他线程使用完共享资源后会解锁互斥量,释放资源)。
2.互斥量基本函数:
#include
初始化互斥量:
int pthread_mutex_init(pthread_mutex *mutex,
const pthread_mutexattr_t* mutexattr); 该函数第一个参数为一个互斥量指针,第二个参数为互斥量属性指针(一般设为NULL)。该函数将按照互斥量属性对互斥量进行初始化。
互斥量加锁:
int pthread_mutex_lock(pthread_mutex *mutex);
该函数申请一个互斥量并对其进行加锁,使该互斥量对其他线程不可用,让其他申请互斥量的线程等待。
互斥量解锁:
int pthread_mutex_unlock(pthread_mutex *mutex);
该函数对互斥量进行解锁操作,使该互斥量对其他线程可以。
销毁互斥量:
int pthread_mutex_destroy(pthread_mutex *mutex);
该函数销毁一个不再需要的互斥量,释放系统资源。
DEMO:
#include
#include
#include
#include
#pragma comment(lib, "pthreadVC2.lib") //必须加上这句
pthread_t t1; //pthread_t变量t1,用于获取线程1的ID
pthread_t t2; //pthread_t变量t2,用于获取线程2的ID
char Share[10]; //共享资源区
pthread_mutex_t work_mutex; //声明互斥量work_mutex
void* My_thread_1(void* args){while (1){char *p &#61; Share;pthread_mutex_lock(&work_mutex); //加锁for (int i &#61; 0; i <9; i&#43;&#43;){*p &#61; &#39;a&#39;; //线程1将Share写成aaaaaaaaSleep(100);p&#43;&#43;;}p&#43;&#43;;*p &#61; &#39;\0&#39;;printf("1 Share is : %s\n", Share);pthread_mutex_unlock(&work_mutex); //解锁Sleep(100); //启用互斥量时也去除注释&#xff0c;为进程调度提供时间}return NULL;
}
void* My_thread_2(void* args){while (1){char *p &#61; Share;pthread_mutex_lock(&work_mutex); //加锁for (int i &#61; 0; i <9; i&#43;&#43;){*p &#61; &#39;e&#39;; //线程1将Share写成eeeeeeeeSleep(150);p&#43;&#43;;}p&#43;&#43;;*p &#61; &#39;\0&#39;;printf("2 Share is : %s\n", Share);pthread_mutex_unlock(&work_mutex); //解锁Sleep(100); //启用互斥量时也去除注释&#xff0c;为进程调度提供时间}return NULL;
}
int main(){pthread_mutex_init(&work_mutex, NULL); //初始化互斥量pthread_create(&t1, NULL, My_thread_1, NULL);pthread_create(&t2, NULL, My_thread_2, NULL);Sleep(1000000);pthread_mutex_destroy(&work_mutex); //销毁互斥量return 0;
}
分析&#xff1a;
不采用互斥锁的情况下&#xff0c;两个线程对共享资源的访问时随机的&#xff0c;如下图所示&#xff1a;
采用互斥锁的情况下&#xff0c;两个线程对共享资源的访问是同步的&#xff0c;产生字符串aaaaaaaaa或eeeeeeeee&#xff0c;如下图所示&#xff1a;