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;
}

猜你喜欢

转载自blog.csdn.net/sam1437/article/details/38232201