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