C++笔记--Linux编程(14)-线程同步
Posted xiangjai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++笔记--Linux编程(14)-线程同步相关的知识,希望对你有一定的参考价值。
目录
线程同步技术
说明
线程共享进程的内存空间,打开的文件描述符,全局变量。
当有多个线程同时访问一块内存空间或者一个变量、一个文件描述符,如果不加控制,那么可能会出现意想不到的结果。
互斥锁
互斥(mutex)是相互排斥的意思,它是一种锁或者信号灯。
互斥用来保护多个线程共享的数据和结构不会被同时修改,一个互斥锁只能有两个状态
locked---加锁
unlocked---解锁
加锁后互斥不让其他线程访问。
任何时刻只能有一个线程来掌握某个互斥上锁。
一个线程如果试图在一个已经加锁的互斥上再加锁,这个线程会被挂起,直到加锁的线程释放掉互斥锁为止。
加锁和解锁函数
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
PTHREAD_MUTEX_INITIALIZER是初始化一个快速锁的宏定义。
pthread_mutex_lock用于给mutex加锁。
pthread_mutex_unlock用于给mutex解锁。
需引入pthread.h
使用mutex线程同步示例
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void *func(void *arg)
{
pthread_mutex_lock(&mutex);
int *a = (int *)arg;
printf("thread%d start\\n", *a);
int i;
for(i=0;i<10;i++)
{
printf("thread%d is running\\n", *a);
sleep(1);
}
printf("thread%d end\\n", *a);
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
int main(int arg, char * args[])
{
printf("process start\\n");
pthread_t thr_d1, thr_d2;
int i[2];
i[0] = 1; i[1] =2;
pthread_create(&thr_d1, NULL, func, &i[0]);
pthread_create(&thr_d2, NULL, func, &i[1]);
pthread_join(thr_d1, NULL);
pthread_join(thr_d2, NULL);
printf("process end\\n");
return 0;
}
读写锁
与互斥锁类似,但读写允许更高的并行性。其特点:写独占,读共享
读写锁状态
具备三种状态:
1. 读模式下加锁状态(读锁)
2. 写模式下加锁状态(写锁)
3. 不加锁状态
读写锁特性
1. 读写锁是“写模式加锁”时,解锁前,所有对该锁加锁的线程都会被阻塞
2. 读写锁是“读模式加锁”时,如果线程以读模式对其加锁会成功;如果线程以写模式加锁会阻塞
读写锁示例
//
// Created by xiangjia on 2021/8/8.
//
#include "stdio.h"
#include "stdlib.h"
#include "unistd.h"
#include "pthread.h"
int beginnum = 100;
pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;
void* thr_write(void *arg) {
while(1) {
pthread_rwlock_wrlock(&rwlock);
printf("--%s--self--%lu--%d\\n", __FUNCTION__, pthread_self(), beginnum++);
sleep(2);
pthread_rwlock_unlock(&rwlock);
sleep(3);
}
}
void* thr_read(void*arg) {
while (1) {
pthread_rwlock_rdlock(&rwlock);
printf("--%s--self--%lu--%d\\n", __FUNCTION__, pthread_self(), beginnum++);
sleep(2);
pthread_rwlock_unlock(&rwlock);
sleep(3);
}
}
int main() {
int n=8,i=0;
pthread_t tid[8];
for(i=0; i<5; i++) {
pthread_create(&tid[i], NULL, thr_read, NULL);
}
for(; i<8; i++) {
pthread_create(&tid[i], NULL, thr_write, NULL);
}
for(i=0; i<8; i++) {
pthread_join(tid[i], NULL);
}
return 0;
}
以上是关于C++笔记--Linux编程(14)-线程同步的主要内容,如果未能解决你的问题,请参考以下文章