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...