本次使用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...