Постановка задачи:
«Ларри, Мо и Керли сажают семена. Ларри выкапывает лунки. Затем Мо кладет семя в каждую лунку. Затем Керли засыпает яму. Есть несколько ограничений синхронизации:
- Мо не может посадить семя, если не существует хотя бы одной пустой лунки, но Моу все равно, насколько Ларри опережает Мо.
- Кудрявый не может заполнить дыру, если не существует хотя бы одной дыры, в которую Мо посадил семя, но эта дыра еще не заполнена. Керли все равно, насколько Мо опережает Керли.
- Керли заботится о том, чтобы Ларри не получил больше, чем МАКС. дырок, впереди Керли. Таким образом, если есть МАКСИМАЛЬНОЕ количество незаполненных отверстий, Ларри придется подождать.
- Есть только одна лопата, которой и Ларри, и Керли нужно копать и засыпать ямы соответственно.
Разработайте, внедрите и протестируйте решение этой проблемы IPC, которое представляет Ларри, Керли и Мо. Используйте семафоры в качестве механизма синхронизации».
Я набрал программу из какого-то псевдокода, который мне дали, но я получаю сообщение об ошибке:
project2part3.c:13:13: warning: initialization makes pointer from integer without a cast [-Wint-conversion]
#define MAX 5
^
project2part3.c:22:18: note: in expansion of macro 'MAX'
sem_t unfilled = MAX;
^
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define MAX 5
void *larry();
void *moe();
void *curly();
pthread_mutex_t shovel = PTHREAD_MUTEX_INITIALIZER;
sem_t empty;
sem_t seeded;
sem_t unfilled;
int main(){
pthread_t ltid;
pthread_t mtid;
pthread_t ctid;
//initializing the semaphores
sem_init(&empty, 0, 0);
sem_init(&seeded, 0, 0);
sem_init(&unfilled, 0, 0);
pthread_create(<id, NULL, larry, NULL); //create the larry thread
pthread_create(&mtid, NULL, moe, NULL); //create the moe thread
pthread_create(&ctid, NULL, curly, NULL); //create the curly thread
pthread_join(ltid,NULL);
pthread_join(mtid,NULL);
pthread_join(ctid,NULL);
}
void *larry(){
while(1){
sem_wait(unfilled);
sem_wait(shovel);
//Dig the hole
printf("Digging");
sem_post(shovel);
sem_post(empty);
}
}
void *moe(){
while(1){
sem_wait(empty);
//Seed the hole
printf("Seeding");
sem_post(seeded);
}
}
void *curly(){
while(1){
sem_wait(seeded);
sem_wait(shovel);
//Fill the hole
printf("Filling");
sem_post(shovel);
sem_post(unfilled);
}
}
void*
, но не возвращают никаких значений. Рыбный. Такжеmain
ничего не возвращает. Также функции, не принимающие параметры, должны быть объявлены как(void)
. Я бы сказал, что вы должны получать гораздо больше предупреждений. - person Eugene Sh.   schedule 04.03.2016sem_t unfilled = MAX;
Это не то, как вы инициализируете семафор... - person Dark Falcon   schedule 04.03.2016main
без явного возврата неявно возвращает 0. Это замечательная функция, которая экономит мне около 10 нажатий клавиш каждый раз, когда я пишуmain
. - person eran   schedule 04.03.2016return
, не определено. Обновление: stackoverflow.com/questions/3727051/ - person Eugene Sh.   schedule 04.03.2016EXIT_SUCCESS
, что, в отличие от 0, может вызвать проблемы. - person Daniel Jour   schedule 04.03.2016gcc -c -Wall -Wextra -Wconversion -pedantic -std=gnu99 filename.c -o filename.o -I. -I/usr/include
) - person user3629249   schedule 06.03.2016