1. 程式人生 > >Linux下的訊號燈semaphore的應用

Linux下的訊號燈semaphore的應用

如果使用mutex_lock,mutex_unlock方式同步操作,如果當很長一段時間內都沒有任何操作,

但是執行緒依然會不停地執行lock,unlock操作。所以這樣的做法是完全沒有任何的意義的。

Linux系統還提供了另外一種同步機制,訊號燈,Semaphore。使用方法如下例子:

示例說明:一個執行緒在控制檯輸入,另一個執行緒將輸入的結果列印顯示。

示例程式碼如下:

#include "pthread_head.h"

sem_t sem;

char buf[SIZE];

void *tfn1(void *arg)
{
    int i;
    for(i = 0; ; i++){
	sem_wait(&sem); //p操作
	if(strncmp(buf,"quit",4) == 0)
	    break;
	printf("%s",buf);
    }

    return (void*)0;
}

void *tfn2(void *arg)
{
    int i;
    for(i = 0; ; i++){
	fgets(buf,SIZE,stdin);
	sem_post(&sem); //v操作
	if(strncmp(buf,"quit",4) == 0)
	    break;
    }

    return (void*)0;
}
int main(void)
{
    pthread_t tid1, tid2;
    sem_init(&sem,0,0);
    if(pthread_create(&tid1,NULL,tfn1,NULL) < 0)
	p_error("pthread_create");
    if(pthread_create(&tid2,NULL,tfn2,NULL) < 0)
	p_error("pthread_create");

    if(pthread_join(tid1,NULL) < 0)
	p_error("pthread_join");
    if(pthread_join(tid2,NULL) < 0)
	p_error("pthread_join");
    return 0;
}