首先你得知道什么叫信号量,什么时候要用信号量。
这个嘛,主要就是用来保护共享资源的,也就是说如果你想限制某个(些)资源在同一时刻只能有一(多)个线程拥有,就可以使用信号量。当然也可以用作让一个线程等待另一个线程完成某项工作。

 

 

信号量的主要函数有:

int sem_init(sem_t *sem,int pshared,unsigned int value);  //pshared是用来表示这个信号量的值是多少。一般信号量用于多个线程间共享时,这个值为0
int sem_wait(sem_t *sem);      --------如果有,获取信号量,并减1
int sem_post(sem_t *sem);      --------给信号量加1,让其他线程可启动
常用的就是上面三个,还有三个不常用的:
int sem_getvalue(sem_t *sem); -------就是读取当前的信号灯的数目
int sem_destroy(sem_t *sem);  --------信号量用完后摧毁这个信号量,不再使用
int sem_trywait(sem_t *sem); ------就是测试一下看看现在有没有可用的信号灯,而不会阻塞。
#include <stdio.h>
  #include <semaphore.h>

  sem_t sem;
  void* func1(void)
  {
      sem_wait(&sem);
      int *running=arg;
      printf("thread running1\n");
      printf("%d\n",*running);
  }

  void* func2(void* arg)
  {
      printf("pthread2 running\n");
      sem_post(&sem);
  }
  int main()
  {
      sem_init(&sem,0,0);
      pthread_t thread[2];
      int a=5;
      pthread_create(&(thread[0]),NULL,(void*)func,(void*)&a);
      printf("main thread running\n");
      sleep(10);
      pthread_create(&(thread[1]),NULL,(void*)func2,(void*)&a);
      printf("main thread running2\n");
      pthread_join(thread[0],NULL);
      pthread_join(thread[1],NULL);
      sem_destory(&sem);
  }
main pthread running
main pthread running2
pthread2 running
pthread1 running
5