linux - 为什么我在运行多线程程序时得到不同的结果?
问题描述
我在做操作系统程序作业时遇到了一些麻烦。而且我想了很多时间都没有得到它。所以我希望有人能帮助我。非常感谢!这是我的代码。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
#include <time.h>
#include "buffer.h"
// Global variables
buffer_item buffer[BUFFER_SIZE];
pthread_mutex_t mutex;
sem_t full, empty;
int count, in, out;
// Function prototypes
int insert_item(buffer_item item);
int remove_item(buffer_item *item);
void *consumer(void *param);
void *producer(void *param);
int main(int argc, char **argv){
if (argc != 4){
printf("ERROR: Provide exactly three arguments.\n");
exit(1);
}
// Retrieve command line arguments
const long int stime = strtol(argv[1], NULL, 0);
const long int num_producer = strtol(argv[2], NULL, 0);
const long int num_consumer = strtol(argv[3], NULL, 0);
// Initialize
int i;
srand(time(NULL));
pthread_mutex_init(&mutex, NULL);
sem_init(&empty, 0, BUFFER_SIZE); // All of buffer is empty
sem_init(&full, 0, 0);
count = in = out = 0;
// Create the producer and consumer threads
pthread_t producers[num_producer];
pthread_t consumers[num_consumer];
for(i = 0; i < num_producer; i++)
pthread_create(&producers[i], NULL, producer, NULL);
for(i = 0; i < num_consumer; i++)
pthread_create(&consumers[i], NULL, consumer, NULL);
// Sleep before terminating
sleep(stime);
return 0;
}
// Insert item into buffer.
//Returns 0 if successful, -1 indicating error
int insert_item(buffer_item item){
int success;
sem_wait(&empty);
pthread_mutex_lock(&mutex);
// Add item to buffer
if( count != BUFFER_SIZE){
buffer[in] = item;
in = (in + 1) % BUFFER_SIZE;
count++;
success = 0;
}
else
success = -1;
pthread_mutex_unlock(&mutex);
sem_post(&full);
return success;
}
// Remove an object from the buffer, placing it in item.
// Returns 0 if successful, -1 indicating error
int remove_item(buffer_item *item){
int success;
sem_wait(&full);
pthread_mutex_lock(&mutex);
// Remove item from buffer to item
if( count != 0){
*item = buffer[out];
out = (out + 1) % BUFFER_SIZE;
count--;
success = 0;
}
else
success = -1;
pthread_mutex_unlock(&mutex);
sem_post(&empty);
return success;
}
void *producer(void *param){
buffer_item item;
while(1){
sleep(rand() % 5 + 1); // Sleep randomly between 1 and 5 seconds
item = rand();
if(insert_item(item))
printf("Error occured\n");
else
printf("Producer produced %d\n", item);
}
}
void *consumer(void *param){
buffer_item item;
while(1){
sleep(rand() % 5 + 1); // Sleep randomly between 1 and 5 seconds
if(remove_item(&item))
printf("Error occured\n");
else
printf("Consumer consumed %d\n", item);
}
}
在我多次运行此代码之后。我得到了这样的结果。
piltover@ubuntu:~/OS_experiments/os__4$ ./producer-consumer 3 3 3
Producer produced 892960721
Consumer consumed 892960721
piltover@ubuntu:~/OS_experiments/os__4$ ./producer-consumer 3 3 3
Producer produced 475993778
Producer produced 392780203
Producer produced 394885920
piltover@ubuntu:~/OS_experiments/os__4$ ./producer-consumer 3 3 3
Producer produced 1594225387
Producer produced 1294344241
Consumer consumed 1594225387
Consumer consumed 1294344241
piltover@ubuntu:~/OS_experiments/os__4$ ./producer-consumer 3 3 3
Producer produced 114010022
Producer produced 750521244
Producer produced 1956360586
piltover@ubuntu:~/OS_experiments/os__4$ ./producer-consumer 3 3 3
piltover@ubuntu:~/OS_experiments/os__4$ ./producer-consumer 3 3 3
Producer produced 1882393161
Producer produced 242009076
Consumer consumed 1882393161
Consumer consumed 1882393161
piltover@ubuntu:~/OS_experiments/os__4$ ./producer-consumer 3 3 3
Producer produced 395560134
Consumer consumed 395560134
Producer produced 1352548714
Producer produced 1419998606
Consumer consumed 1352548714
Consumer consumed 1419998606
piltover@ubuntu:~/OS_experiments/os__4$
我很困惑为什么结果的数量和顺序完全不同。例如,生产者和消费者的数量不相同。
解决方案
推荐阅读
- arrays - Numpy:如何用另一列替换 numpy 数组中的列?为什么这个例子不起作用?
- firebase - Firebase 函数 admin sdk 获取云存储对象的下载 url:权限被拒绝
- azure - 使用单独的前端和后端应用程序进行 Azure AD 代表身份验证
- python - 如何从 Python 中的单个输入中删除列表的两个或多个对象?
- python - KeyError:“不再支持将列表喜欢传递给带有任何缺失标签的 .loc 或 []
- linux - 如何在 Linux 内核中启用有符号整数溢出 UBSan?
- javascript - 将 fillStyle 设置为列表项不起作用?
- django - Apple使用allauth和rest-auth登录django rest框架
- react-native - Expo react-native:.png 图像未显示在 testflight 应用程序上(在开发中工作正常)
- java - Hashset contains with exact character placement and incorrect character placement