linux多线程学习(六)——信号量实现同步。

信号量的互斥同步都是通过PV原语来操作的,我们可以通过注册两个信号量,让它们在互斥的问题上互动,从而达到同步。通过下面实例就可以很容易理解:

 

#include <stdlib.h>    
#include <stdio.h>    
#include <unistd.h>    
#include <pthread.h>    
#include <semaphore.h>    
#include <errno.h>    
    
#define  return_if_fail(p)  if((p) == 0){printf ("[%s]:func error!/n", __func__);return;}    
    
typedef struct _PrivInfo    
{    
  sem_t s1;    
  sem_t s2;    
  time_t end_time;    
}PrivInfo;    
    
static void info_init (PrivInfo* thiz);    
static void info_destroy (PrivInfo* thiz);    
static void* pthread_func_1 (PrivInfo* thiz);    
static void* pthread_func_2 (PrivInfo* thiz);    
    
int main (int argc, char** argv)    
{    
  pthread_t pt_1 = 0;    
  pthread_t pt_2 = 0;    
  int ret = 0;    
  PrivInfo* thiz = NULL;    
      
  thiz = (PrivInfo* )malloc (sizeof (PrivInfo));    
  if (thiz == NULL)    
  {    
    printf ("[%s]: Failed to malloc priv.\n");    
    return -1;    
  }    
    
  info_init (thiz);    
    
  ret = pthread_create (&pt_1, NULL, (void*)pthread_func_1, thiz);    
  if (ret != 0)    
  {    
    perror ("pthread_1_create:");    
  }    
    
  ret = pthread_create (&pt_2, NULL, (void*)pthread_func_2, thiz);    
  if (ret != 0)    
  {    
     perror ("pthread_2_create:");    
  }    
    
  pthread_join (pt_1, NULL);    
  pthread_join (pt_2, NULL);    
    
  info_destroy (thiz);    
      
  return 0;    
}    
    
static void info_init (PrivInfo* thiz)    
{    
  return_if_fail (thiz != NULL);    
    
  thiz->end_time = time(NULL) + 10;    
      
  sem_init (&thiz->s1, 0, 1);    
  sem_init (&thiz->s2, 0, 0);    
    
  return;    
}    
    
static void info_destroy (PrivInfo* thiz)    
{    
  return_if_fail (thiz != NULL);    
    
  sem_destroy (&thiz->s1);    
  sem_destroy (&thiz->s2);    
    
  free (thiz);    
  thiz = NULL;    
    
  return;    
}    
    
static void* pthread_func_1 (PrivInfo* thiz)    
{    
  return_if_fail (thiz != NULL);    
    
  while (time(NULL) < thiz->end_time)    
  {    
    sem_wait (&thiz->s2);    
    printf ("pthread1: pthread1 get the lock.\n");    
    
    sem_post (&thiz->s1);    
    printf ("pthread1: pthread1 unlock\n");    
    
    sleep (1);    
  }    
    
  return;    
}    
    
static void* pthread_func_2 (PrivInfo* thiz)    
{    
  return_if_fail (thiz != NULL);    
    
  while (time (NULL) < thiz->end_time)    
  {    
    sem_wait (&thiz->s1);    
    printf ("pthread2: pthread2 get the unlock.\n");    
    
    sem_post (&thiz->s2);    
    printf ("pthread2: pthread2 unlock.\n");    
    
    sleep (1);    
  }    
    
  return;    
}    

pthread2: pthread2 get the unlock.
pthread2: pthread2 unlock.
pthread1: pthread1 get the lock.
pthread1: pthread1 unlock
pthread2: pthread2 get the unlock.
pthread2: pthread2 unlock.
pthread1: pthread1 get the lock.
pthread1: pthread1 unlock
pthread2: pthread2 get the unlock.
pthread2: pthread2 unlock.
pthread1: pthread1 get the lock.
pthread1: pthread1 unlock
pthread2: pthread2 get the unlock.
pthread2: pthread2 unlock.
pthread1: pthread1 get the lock.
pthread1: pthread1 unlock
pthread2: pthread2 get the unlock.
pthread2: pthread2 unlock.
pthread1: pthread1 get the lock.
pthread1: pthread1 unlock
pthread2: pthread2 get the unlock.
pthread2: pthread2 unlock.
pthread1: pthread1 get the lock.
pthread1: pthread1 unlock
pthread2: pthread2 get the unlock.
pthread2: pthread2 unlock.
pthread1: pthread1 get the lock.
pthread1: pthread1 unlock
pthread2: pthread2 get the unlock.
pthread2: pthread2 unlock.
pthread1: pthread1 get the lock.
pthread1: pthread1 unlock
pthread2: pthread2 get the unlock.
pthread2: pthread2 unlock.
pthread1: pthread1 get the lock.
pthread1: pthread1 unlock
pthread2: pthread2 get the unlock.
pthread2: pthread2 unlock.
pthread1: pthread1 get the lock.
pthread1: pthread1 unlock

通过执行结果后,可以看出,会先执行线程二的函数,然后再执行线程一的函数。它们两就实现了同步。在上大学的时候,虽然对这些概念知道,可都没有实践过,所以有时候时间一久就会模糊甚至忘记,到了工作如果还保持这么一种状态,那就太可怕了。虽然现在外面的技术在不断的变化更新,可是不管怎么变,其核心技术还是依旧的,所以我们必须要打好自己的基础,再学习其他新的知识,那时候再学新的知识也会觉得比较简单的。闲话多说了两句,在下一篇文章中,我们将会实现一个经典的实例回顾这段时间对多线程的学习,那就是消费者和生产者。

 

~~END~~


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值