示例:主线程产生了两个线程,一个模拟生产放入,一个模拟取水果吃
几点注意事项:
- 引入头文件
- #include <pthread.h> 使用多线程时必须引入的头文件
- #include <semaphore.h> sem_t结构是信号量的数据类型,它本质上是一个长整型的数。使用sem_*必须引入这个头文件
- gcc编译
- 报错信息:undefined reference to `sem_init';undefined reference to `sem_post';undefined reference to `sem_wait'
- 解决方案:gcc编译时需要加入一个多线程选项 gcc -pthread -o filename filename.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
int n;
sem_t product,empty;
void *eat(void *arg){
while (1) {
printf("**\tSON WANT TO EAT FRUIT\n");
sem_wait(&product);
sem_getvalue(&product,&n);
printf("**\tThere are %d fruits now\n",n);
sem_post(&empty);
sleep(10);
}//while
}
void *putfruit(void *arg){
while (1) {//main thread ,put fruit
printf("Main thread want to put fruit\n");
sem_wait(&empty);
sleep(1);
sem_post(&product);
sem_getvalue(&product,&n);
printf("Main: putting fruit in a secs,fruits is %d \n",n);
}//while
}
int main(){
//Claim process
pthread_t threadP,threadC;
//result of process
void *thread_result1,*thread_result2;
//flag
int semi,ret1,ret2;
semi = sem_init(&empty, 0, 5); //初始设置5个空资源,生产者可连续放入5次
if (semi == -1) { printf("sem_init empty failed \n");
return -1; }
semi = sem_init(&product, 0, 0); //初始设置0个产品数
if (semi == -1) { printf("sem_init product failed \n");
return -1; }
ret1 = pthread_create(&threadC, NULL,eat,NULL);
ret2 = pthread_create(&threadP, NULL,putfruit,NULL);
if (ret1 != 0|ret2!=0) { printf("pthread_create failed \n");
return -1; }
ret1 = pthread_join(threadC, &thread_result1);
ret2 = pthread_join(threadP, &thread_result2);
if (ret1!=0||ret2!=0)
{ perror("Thread join failed!\n");
exit(EXIT_FAILURE); }//if error
return 0; } //main