linux訊號量實現執行緒讀寫同步

2021-07-15 09:42:28 字數 1624 閱讀 7968

本次使用linux訊號量來實現執行緒讀寫同步,還是實現之前寫的那個讀和寫陣列的例子,本次在寫的過程中出現乙個死鎖問題,原因是先進入臨界區,然後等待訊號量,這樣造成讀函式在等待訊號量,寫函式在等待進入臨界區,所以修改了下程式,先進入訊號量的等待,再進入臨界區的等待,這也說明了我們寫程式時不能長時間占用臨界區,會很容易造成死鎖。程式**如下:

#include #include #include #include #include #define max_num  100

#define max_thread 10

static int g_array[max_num];

volatile int g_num_gen = 0;

volatile int g_count = 0;

static int g_stop = 0;

static sem_t g_sem_full;

static sem_t g_sem_empty;

static pthread_mutex_t g_mutex = pthread_mutex_initializer;

void *write_thread(void *arg)

g_array[g_count++] = g_num_gen++;

printf("write %d count=%d tid=%lu\n", g_array[g_count-1], g_count, pthread_self() );

pthread_mutex_unlock(&g_mutex);

sem_post(&g_sem_full);

usleep(1000*500);

}for(i=0; ipthread_mutex_unlock(&g_mutex);

return null;

}void *read_thread(void *arg)

printf("read %d count=%d tid=%lu\n", g_array[g_count-1], g_count, pthread_self() );

g_count--;

pthread_mutex_unlock(&g_mutex);

sem_post(&g_sem_empty);

usleep(1000*500);

}for(i=0; ipthread_mutex_unlock(&g_mutex);

return null;

}int main()

if( sem_init(&g_sem_empty, 1, max_num) == -1 )

if ((tid = (pthread_t *)calloc(max_thread, sizeof(pthread_t))) == null)

/* 開啟寫執行緒 */

for(i=0; i<8; i++)

/* 開啟讀執行緒 */

for(i=8; i/* 由使用者輸入任意值,然後各個執行緒安全退出 */

getchar();

g_stop = 1;

for(i=0; ifree(tid);

sem_destroy(&g_sem_empty);

sem_destroy(&g_sem_full);

return 0;

}

訊號量實現讀寫鎖

一般的讀寫鎖 一般的讀寫鎖都是一開始對鎖分配max resource個資源,其中寫操作的時候會一次性占用 max resource個資源,而讀操作的時候就只會占用乙個資源。這樣子會出現乙個問題就是 如果在當前資源的數目不為max resource的時候,那麼總是不能進行寫操作,只能是進行 讀操作,如...

執行緒 訊號量

訊號量 訊號量本質上是乙個非負的整數計數器,它被用來控制對公共資源的訪問。當公共資源增加時,呼叫函式sem post 增加訊號量。只有當訊號量值大於 時,才能使用公共資源,使用後,函式sem wait 減少訊號量。函式sem trywait 和函式pthread mutex trylock 起同樣的...

Linux 執行緒 四 (訊號量)

執行緒中的訊號量和程序中的訊號量的作用相同,都是用於同步操作,達到無衝突的訪問共享資源的目的。但是它們也是有一定的區別的。執行緒中的訊號量通過引數的不同,也可以在程序間使用。和semget 函式建立的訊號量不同,執行緒中的訊號量可以使兩個執行緒進行同步。我們先看一下執行緒中訊號量的api及其引數 i...