关于线程信号量的一段小代码

来源:互联网 发布:阿里云企业邮箱免费版 编辑:程序博客网 时间:2024/05/14 10:41
#include<pthread.h>#include<string.h>#include<semaphore.h>#include<errno.h>#include<stdio.h>#include<stdlib.h>#define MAXSTACK 100int stack[MAXSTACK][2]; int size=0;sem_t sem;int m = 0;int n = 0;void readdata1(void);void readdata2(void);void handledata1(void);void handledata2(void);int main(){pthread_t t1, t2, t3, t4;sem_init(&sem, 0, 0);int i;pthread_create(&t1, NULL, (void*)handledata1, NULL);pthread_create(&t2, NULL, (void*)handledata2, NULL);pthread_create(&t3, NULL, (void*)readdata1, NULL);pthread_create(&t4, NULL, (void*)readdata2, NULL);printf("-----------------create over-----------------\n");pthread_join(t1, NULL);pthread_join(t2, NULL);pthread_join(t3, NULL);pthread_join(t4, NULL);printf("-----------------join over-----------------\n");sem_destroy(&sem);return 0;}void readdata1(void){FILE* fp;if((fp = fopen("1.data", "r")) < 0){printf("%s fopen failed: %s\n", __FUNCTION__, strerror(errno));}while(!feof(fp)){fscanf(fp, "%d %d", &stack[size][0], &stack[size][1]);printf("----%s: stack[%d][0][1]: %d %d \n", __FUNCTION__, size, stack[size][0], stack[size][1]);sem_post(&sem);size++;}printf("\n");fclose(fp);printf("%s exit\n", __FUNCTION__);pthread_exit(0);}void readdata2(void){FILE* fp;if((fp = fopen("2.data", "r")) < 0){printf("%s fopen failed: %s", __FUNCTION__, strerror(errno));}while(!feof(fp)){fscanf(fp, "%d %d", &stack[size][0], &stack[size][1]);printf("----%s: stack[%d][0][1]: %d %d \n", __FUNCTION__, size, stack[size][0], stack[size][1]);sem_post(&sem);size++;}printf("\n");fclose(fp);printf("%s exit\n", __FUNCTION__);pthread_exit(0);}void handledata1(void){while(1){printf("%s blocked %d\n", __FUNCTION__, m);sem_wait(&sem);printf("%s block released %d\n", __FUNCTION__, m++);printf("Plus: stack[%d][0][1] %d + %d = %d\n", size, stack[size][0], stack[size][1], stack[size][0]+stack[size][1]);--size;}printf("%s exit\n", __FUNCTION__);pthread_exit(0);}void handledata2(void){while(1){printf("%s blocked %d\n", __FUNCTION__, n);sem_wait(&sem);printf("%s block released %d\n", __FUNCTION__, n++);//printf("multiply: %d * %d = %d\n", stack[size][0], stack[size][1], stack[size][0]*stack[size][0]);printf("Multiply: stack[%d][0][1] %d * %d = %d\n", size, stack[size][0], stack[size][1], (stack[size][0])*(stack[size][1]));--size;}printf("%s exit\n", __FUNCTION__);pthread_exit(0);}