多執行緒順序列印ABC 實現讀寫鎖

2021-09-17 23:03:28 字數 3107 閱讀 2299

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

)void

*func1 (

void*)

void

*func2 (

void*)

void

*func3 (

void*)

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_t mutex = pthread_mutex_initializer;

//定義和初始化互斥鎖

pthread_cond_t cond = pthread_cond_initializer;

//定義和初始化條件變數

寫模式:

pthread_mutex_lock

(&mutex)

;//加鎖

while

(w !=

0|| r >0)

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)

r++;

pthread_mutex_unlock

(&mutex)

;讀讀讀……

pthread_mutex_lock

(&mutex);r-

-;if(r ==0)

pthread_cond_broadcast

(&cond)

;//喚醒其他因條件變數而產生的阻塞

pthread_mutex_unlock

(&mutex)

;//解鎖

訊號量實現讀寫鎖

#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)

;

學習 多執行緒順序列印ABC

深夜睡不著,更新一波,突然想起了兩個月之前的一次面試的懊悔。為什麼懊悔呢,因為面試官出的題很簡單很簡單,但是我想太多了,導致出糗了。題目,有三個執行緒,按順序列印123。public class test1 extends thread thread b newthread new runnable...

多執行緒之abc順序列印10次

package com.ghgj.cn.thread public class threadabc catch interruptedexception e system.out.println a thread1 false 保證本執行緒不死 thread2 true 喚醒2執行緒 thread3...

多執行緒按順序列印

於leetcode1114 我們提供了乙個類 public class foo public void second public void third 三個不同的執行緒將會共用乙個 foo 例項。請設計修改程式,以確保 second 方法在 first 方法之後被執行,third 方法在 seco...