linux用信号量使两个线程同步

有两个线程,分别对一个队列进行入队(Enque)和出队(Deque)操作,但不能同时操作,即在入队时不能出队,出队时不能入队,经过学习后发现线程同步可以用互斥量和信号量,但用互斥量写好的代码看起来有点混乱,最后用信号量实现了一个优美的线程同步。

下面就是实现的大致方法:

首先创建两个信号量,并对其初始化:

sem_t enque; // 入队信号量
sem_t deque; // 出队信号量
int res;
<pre name="code" class="cpp">res = sem_init(&enque, 0, 1);// 入队初始化为1
if (res != 0)
{
    perror("semaphore  enque initialization failed\n");
    exit(EXIT_FAILURE);
}
res = sem_init(&deque, 0, 0);// 出队初始化为0
if (res != 0)
{
    perror("semaphore deque initialization failed\n");
    exit(EXIT_FAILURE);
}
 可以看出在初始化这两个信号量时初始值是不同的,这点很重要。 

然后就是用信号量对两个线程进行同步:

void* enque_thread(void *argv)
{
    while(1)
    {
        sem_wait(&enque); // enque减1
    
        // 入队操作
    
        sem_post(&deque); // deque加1
    }
}

void* deque_thread(void *argv)
{
    while(1)
    {
        sem_wait(&deque); // deque减1
    
        // 出队操作
    
        sem_post(&enque); // enque加1
    }
}
上面是两个线程处理函数,分别用于入队和出队,分别在线程的无线循环里的开始和结束处对信号量进行处理,这样就可以实现同时只有一个线程在运行,另一个处于堵塞状态。如在入队在操作执行后将出队信号量加1,此时入队进入等待,则出队可以执行,出队执行后将入队信号量加1,出队此时在等待,入队可以执行。

能够实现这一功能的关键在于sem_wait函数,该函数以原子方式将信号量减1,但是只有在信号量为非零值时才能减1,否则这个函数就处于等待状态。
sem_post函数可以以原子方式将信号量加1,原子操作是指如果两个线程同时给一个信号量加1或减1,互不干扰,如两个线程对一个信号量同时加1,则最终会加2;同时减1则最终会减2(当然在信号量不为零的前提下);如果一个加1,一个减1,则最终不变。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值