信号量sem相关函数
#include <semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned int value);
//参数一:信号量标志
//参数二:0表示进程内通用,1表示进程间通用,一般0
//参数三:要设置的初始值是多少
int sem_wait(sem_t *sem); //让信号量的值-1,相当于p操作
int sem_post(sem_t *sem); //让信号量的值+1,相当于v操作
int sem_destroy(sem_t *sem); //销毁信号量
#include<stdio.h>
#include <semaphore.h>
#include<stdlib.h>
#define PRO 3
#define COR 2
#define BUFFSZ 5
sem_t full_id;
sem_t empty_id;
pthread_t tid[PRO+COR];
pthread_mutex_t mutex;
int buf[BUFFSZ];
int in = 0;
int out = 0;
int ready = 1;
void *pro(void *arg) {
int id = *(int*)arg;
int i;
while ( 1 ) {
sem_wait(&full_id);
pthread_mutex_lock(&mutex);
printf("%d生产者线程开始生产:\n", id);
buf[in] = ready++;
int tmp = in;
in = (in+1) % BUFFSZ;
pthread_mutex_unlock(&mutex);
sem_post(&empty_id);
sleep(2);
printf("%d生产者生产完毕%d产品,装在buf[%d]位置\n", id, ready-1, tmp);
}
return arg;
}
void *cor(void *arg) {
int id = *(int*)arg;
int i = 0;
while ( 1 ) {
sem_wait(&empty_id);
pthread_mutex_lock(&mutex);
printf("%d 消费者线程:\n");
for (i=0; i<BUFFSZ; i++) {
printf("\tbuf[%d]=%d", i, buf[i]);
if ( i == out ) {
printf("====> out");
}
printf("\n");
}
sleep(2);
out = (out+1)%BUFFSZ;
pthread_mutex_unlock(&mutex);
sem_post(&full_id);
}
return arg;
}
int main( void ) {
int i;
pthread_mutex_init(&mutex, NULL);
sem_init(&full_id, 0, BUFFSZ);
sem_init(&empty_id, 0, 0);
for(i=0; i<PRO; i++) {
int *p = malloc(sizeof(int));
*p = i;
pthread_create(&tid[i], NULL, pro, p);
}
for (i=0; i<COR; i++) {
int *p = malloc(sizeof(int));
*p = i;
pthread_create(&tid[PRO+i], NULL, cor, p);
}
for (i=0; i<PRO+COR; i++) {
int *p = NULL;
pthread_join(tid[i], (void**)&p);
free(p);
}
pthread_mutex_destroy(&mutex);
sem_destroy(&full_id);
sem_destroy(&empty_id);
}
转载请注明原文地址:https://ipadbbs.8miu.com/read-41228.html