歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux線程間用信號量通信

Linux線程間用信號量通信

日期:2017/3/1 10:14:26   编辑:Linux編程

原來總是用互斥鎖(MUTEX)和環境變量(cond)去控制線程的通信,用起來挺麻煩的,用信號量(SEM)來通信控制就方便多了!

用到信號量就要包含semaphore.h頭文件。

可以用sem_t類型來聲明一個型號量。

用int sem_init(sem_t *sem, int pshared, unsigned int value)函數來初始化型號量,第一個參數就是用sem_t聲明的信號量,第二變量如果為0,表示這個信號量只是當前進程中的型號量,如果不為0,這個信號量可能可以在兩個進程中共享。第三個參數就是初始化信號量的多少值。

sem_wait(sem_t *sem)函數用於接受信號,當sem>0時就能接受到信號,然後將sem--;

sem_post(sem_t *sem)函數可以增加信號量。

sem_destroy(sem_t *sem)函數用於解除信號量。

以下是一個用信號控制的一個簡單的例子。

  1. #include <stdio.h>
  2. #include <semaphore.h>
  3. #include <pthread.h>
  4. sem_t sem1, sem2;
  5. void *thread1(void *arg)
  6. {
  7. sem_wait(&sem1);
  8. setbuf(stdout,NULL);//這裡必須注意,由於下面輸出"hello"中沒有‘\n’符,所以可能由於輸出緩存已滿,造成輸不出東西來,所以用這個函數把輸出緩存清空
  9. printf("hello ");
  10. sem_post(&sem2);
  11. }
  12. void *thread2(void *arg)
  13. {
  14. sem_wait(&sem2);
  15. printf("world!\n");
  16. }
  17. int main()
  18. {
  19. pthread_t t1, t2;
  20. sem_init(&sem1,0,1);
  21. sem_init(&sem2,0,0);
  22. pthread_create(&t1,NULL,thread1,NULL);
  23. pthread_create(&t2,NULL,thread2,NULL);
  24. pthread_join(t1,NULL);
  25. pthread_join(t2,NULL);
  26. sem_destroy(&sem1);
  27. sem_destroy(&sem2);
  28. return 0;
  29. }

程序的實現是控制先讓thread1線程打印"hello "再讓thread2線程打印"world!".

Copyright © Linux教程網 All Rights Reserved