Linux|多线程顺序打印ABC、实现读写锁

1、多线程顺序打印ABC

#include #include #include #include sem_t sem_id1, sem_id2, sem_id3; void* func1(void*); //声明 void* func2(void*); void* func3(void*); int main(void) { sem_init(&sem_id1, 0, 1); //活动 sem_init(&sem_id2, 0, 0); sem_init(&sem_id3, 0, 0); pthread_t pthread_id1, pthread_id2, pthread_id3; pthread_create(&pthread_id1, NULL, func1, NULL); pthread_create(&pthread_id2, NULL, func2, NULL); pthread_create(&pthread_id3, NULL, func3, NULL); pthread_join(phread_id1, NULL); pthread_join(phread_id1, NULL); pthread_join(phread_id1, NULL); return 0; } void *func1 (void*) { sem_wait(sem_id1); printf("A\n"); sem_post(sem_id2); } void *func2 (void*) { sem_wait(sem_id2); printf("B\n"); sem_post(sem_id3); } void *func3 (void*) { sem_wait(sem_id3); printf("C\n"); sem_post(sem_id1); } 链接:https://www.nowcoder.com/questionTerminal/6eee35cb516041b38322fac49406620f

2、互斥锁实现读写锁
#include //多线程、互斥锁所需头文件 pthread_mutex_t r_mutex = PTHREAD_MUTEX_INITIALIZER; //定义和初始化互斥锁 pthread_mutex_t w_mutex = PTHREAD_MUTEX_INITIALIZER; int readers = 0; //记录读者的个数 写模式: pthread_mutex_lock(&w_mutex); 写写写…… pthread_mutex_unlock(&w_mutex); 读模式: pthread_mutex_lock(&r_mutex); //这个锁是对readers资源的互斥,不能同时++ if(readers == 0)//不为0的时候说明其它的读操作已经给w_mutex加锁了,不能写了 pthread_mutex_lock(&w_mutex); readers++; pthread_mutex_unlock(&r_mutex); //解除对readers的锁,保证其它的读锁继续能读 读读读…… pthread_mutex_lock(&r_mutex); //这个同样是对readers资源的互斥,总不能同时-- readers--; if(reader == 0) pthread_mutex_unlock(&w_mutex); //没有人在读了,可以加写锁了 pthread_mutex_unlock(&r_mutex);

条件变量实现读写锁
#include //多线程、互斥锁所需头文件 pthread_mutex_tmutex = PTHREAD_MUTEX_INITIALIZER; //定义和初始化互斥锁 pthread_cond_tcond = PTHREAD_COND_INITIALIZER; //定义和初始化条件变量 写模式: pthread_mutex_lock(&mutex); //加锁 while(w != 0 || r > 0) { pthread_cond_wait(&cond, &mutex); //等待条件变量的成立 } w = 1; pthread_mutex_unlock(&mutex); 写写写…… pthread_mutex_lock(&mutex); w = 0; pthread_cond_broadcast(&cond); //唤醒其他因条件变量而产生的阻塞 pthread_mutex_unlock(&mutex); //解锁 读模式: pthread_mutex_lock(&mutex); while(w != 0) { pthread_cond_wait(&cond, &mutex); //等待条件变量的成立 } r++; pthread_mutex_unlock(&mutex); 读读读…… pthread_mutex_lock(&mutex); r- -; if(r == 0) pthread_cond_broadcast(&cond); //唤醒其他因条件变量而产生的阻塞 pthread_mutex_unlock(&mutex); //解锁

【Linux|多线程顺序打印ABC、实现读写锁】信号量实现读写锁
#include//线程信号量所需头文件 sem_t r_sem; //定义信号量 sem_init(&r_sem, 0, 1); //初始化信号量 sem_t w_sem; //定义信号量 sem_init(&w_sem, 0, 1); //初始化信号量 int readers = 0; 写模式: sem_wait(&w_sem); 写写写…… sem_post(&w_sem); 读模式: sem_wait(&r_sem); if(readers == 0) sem_wait(&w_sem); readers++; sem_post(&r_sem); 读读读…… sem_wait(&r_sem); readers- -; if(readers == 0) sem_post(&w_sem); sem_post(&r_sem);

    推荐阅读