操作系統實驗上機
更多技術請訪問:www.xuanworld.top
部分審核不通過的文章將發至個人博客:www.xuanworld.top
歡迎來52破解論壇閱讀帖子:https://www.52pojie.cn/thread-1891208-1-1.html
實驗名稱 | 實驗序號 | 實驗日期 | 實驗人 |
---|---|---|---|
多線程與信號量編程 | 4 | 公元2077年 | Rytter |
一、實驗題目
二、相關原理和知識
- linux有關于信號量的相關函數,可以直接調用
- 利用pthread進行創建進程,每個進程都會有一個id
- 創建進程后每個進程都會對buffer進行互斥操作
三、實驗過程
- 編寫關于信號量與進程id的函數
- 編寫對buffer進行操作的兩個函數
- 編寫消費者與生產者的函數
- 編寫創建生產者與消費者的函數
- 放到Linux服務器上進行編譯和運行
四、實驗結果
五、問題總結
- 編譯時出現問題,原因位命令行沒有使用pthread
- 消費者的printf代碼位置不對,導致還沒消費就產生輸出
六、源碼
首先是buffer.h文件
typedef int buffer_item;
#define BUFFER_SIZE 5
之后是main.c文件
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <stdlib.h>
#include <unistd.h>
#include "buffer.h"
buffer_item buffer[BUFFER_SIZE];
pthread_mutex_t mutex;
sem_t full,empty;
void buffer_out(){int i;for ( i = 0; i <BUFFER_SIZE ; ++i) {printf("%d",buffer[i]);}printf("\n");
}
int insert_item(int a,int b){sem_wait(&empty);pthread_mutex_lock(&mutex);int i;for(i = 0;i < BUFFER_SIZE;i++){if(buffer[i] == 0){buffer[i] = 1;//找到空的位置break;}}if(i == BUFFER_SIZE) return -1;printf("producer %d produced %d\n",a,b);buffer_out();pthread_mutex_unlock(&mutex);sem_post(&full);return 0;
}
int remove_item(int a,int b){sem_wait(&full);pthread_mutex_lock(&mutex);int i;for(i = 0;i < BUFFER_SIZE;i++){if(buffer[i] != 0){buffer[i] = 0;break;}}if(i == BUFFER_SIZE) return -1;printf("consumer %d consumed %d\n",a,b);//第幾個吃了幾個食物buffer_out();pthread_mutex_unlock(&mutex);sem_post(&empty);return 0;
}void * producer(void * param){int* num = (int*)param;int food_id=0;while(1){sleep(((rand() % 10) + 1));if(insert_item(*num,++food_id))printf("wrong\n");}
}void * consumer(void *param){int* num = (int*)param;int food_id=0;while(1){sleep(((rand() % 10) + 1));if(remove_item(*num,++food_id))printf("wrong\n");}
}int main(int argc,char *argv[])
{//1.獲取命令行輸入的數字if(argc != 4) return -1;int sleep_time = atoi(argv[1]);int producer_num = atoi(argv[2]);int consumer_num = atoi(argv[3]);//2.進行初始化pthread_mutex_init(&mutex,NULL);sem_init(&empty,0,BUFFER_SIZE);sem_init(&full,0,0);int i;for(i=0;i<BUFFER_SIZE;i++) buffer[i]=0;//3.創建線程pthread_t producer_tid[producer_num];int producer_id[producer_num];for(i = 0;i < producer_num;i++){producer_id[i] = i + 1;pthread_create(&producer_tid[i],NULL,producer,&producer_id[i]);}pthread_t consumer_tid[consumer_num];int consumer_id[consumer_num];for(i = 0;i < consumer_num;i++){consumer_id[i] = i + 1;pthread_create(&consumer_tid[i],NULL,consumer,&consumer_id[i]);}//4.休眠sleep(sleep_time);//5.退出return 0;
}