linnux同步方法多種鎖介紹

2021-08-21 08:54:32 字數 2067 閱讀 6426

1.互斥鎖

2.自旋鎖

3.讀寫鎖

4.檔案鎖

5.條件變數

6.訊號量

遞迴與不可遞迴鎖

生產者消費者

1.生產者消費者兩種實現方式(訊號量,訊號量與互斥鎖,互斥鎖與條件變數)

2.訊號量實現讀寫鎖

緩衝區使用

/*

已知迴圈緩衝區是乙個可以無限迴圈讀寫的緩衝區,當緩衝區滿了還繼續寫的話就會覆蓋我們還沒讀取到的資料。下面定義了乙個迴圈緩衝區並初始化,請編寫它的write函式,確保不會破壞將要讀取的資料,編寫read函式確保讀取的buf是已經寫入的資料,請處理好讀寫的rd_pos與wr_pos的值。

*/#include #include #include #define buf_size 64

#define write_size 4

#define read_size 64

typedef struct _ring_buf ring_buf;

ring_buf ring_head;

void init(ring_buf *p_ring, char *buf, unsigned int size)

int deal_read_pos(int read_size)

wr_pos = ring_head.wr_pos;

rd_pos = ring_head.rd_pos;

diff_pos = ring_head.diff_pos;

if(wr_pos == rd_pos) else

} else if(wr_pos > rd_pos) else

} else if(wr_pos < rd_pos) else }}

void *read_fun(void *arg) else

pthread_mutex_unlock(&ring_head.mutex);

usleep(1000*1000);

} return;}/*

fun:judge we can write write_size or not

write_size:need to allocate size to write

return:return remain space to write,or return 0 cannot get remain size

*/int deal_write_pos(int write_size)

wr_pos = ring_head.wr_pos;

rd_pos = ring_head.rd_pos;

diff_pos = ring_head.diff_pos;

if(wr_pos == rd_pos) else

} else if(wr_pos > rd_pos) else

} else if(wr_pos < rd_pos) else }}

void *write_fun(void *arg) else

pthread_mutex_unlock(&ring_head.mutex);

usleep(1000*1000);

}return;

}int main(void) ;

pthread_t read_t;

pthread_t write_t;

int ret = -1;

init(&ring_head, buf, buf_size);

ret = pthread_create(&read_t, null, read_fun, null);

if(ret != 0)

ret = pthread_create(&write_t, null, write_fun, null);

if(ret != 0)

printf("start here~~~\n");

pthread_join(read_t, null);

pthread_join(write_t, null);

printf("end here~~\n");

return 0;

}

Linux 執行緒同步方法 互斥鎖

在單執行緒條件下,由於對資料操作,在同樣的時間下,只有乙個執行緒來操作。所以不用擔心資料的同步問題。現代的作業系統,大都提供併發機制,雖然有時候是表面的併發。在 linux 中,併發用的最多的是基於執行緒的併發,程序的代價太高了,這樣,乙個共享的資料,在同一時間內,可能有多個執行緒在操作。如果沒有同...

Linux核心同步方法 互斥鎖

互斥體 互斥 指的是任何可以睡眠的強制互斥鎖,比如計數是1的訊號量。也就是說,互斥體是一種互斥訊號。互斥在核心中對應資料結構互斥,其行為和使用計數為1的訊號量類似,因為是直接呼叫的訊號量的操作介面,實現更高效,而且使用限制更強。也就是乙個簡化版的訊號量,因為不需要管理任何使用計數。define mu...

給靜態方法加同步鎖

給靜態方法加同步鎖 我們知道利用synchronized關鍵字可以解決執行緒安全的問題,synchronized可以加在 塊中,也可以加在同步方法中。synchronized加在方法中的時候等價於 synchronized this 問題 靜態方法的鎖加在什麼物件上呢?加鎖的時候要傳乙個object...