Tôi đang cố gắng tạo mã mô phỏng trung tâm chăm sóc trẻ em. Ở trung tâm này, một người lớn có thể chăm sóc tối đa ba đứa con. Tình trạng này phải được đáp ứng mọi lúc. Người lớn và trẻ em là các quá trình được tạo ngẫu nhiên và số lượng trẻ em và người lớn được đặt trong các đối số chương trình. Trẻ em chỉ có thể nhập nếu có đủ người lớn bên trong và người lớn chỉ có thể để lại nếu có đủ người lớn khác chăm sóc trẻ em. Nếu không, chờ đợi thụ động nên được thực hiện, cho đến khi điều kiện cho phép trẻ em/người lớn để lại/nhập.Linux thụ động đang chờ cập nhật điều kiện
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
#include <string.h>
#include <semaphore.h>
#include <sys/mman.h>
#include <sys/ipc.h>
#include <sys/shm.h>
void load_init_values();
void handler(int, int, char*);
pid_t adults, children;
int adult_max_t, child_max_t, adc, chc, amt, cmt, shm_a_id, shm_c_id;
int *adults_inside, *children_inside;
sem_t *adults_sem, *children_sem, *entry;
int main(int argc, char *argv[])
{
srand(time(NULL));
setbuf(stdout,NULL);
adc=atoi(argv[1]);
chc=atoi(argv[2]);
adult_max_t=atoi(argv[3]);
child_max_t=atoi(argv[4]);
amt=atoi(argv[5]);
cmt=atoi(argv[6]);
int pid=0;
load_init_values();
adults = fork();
if (adults == 0)
{
for(int i=0; i<=adc-1; i++)
{
int adult_t = (random() % (adult_max_t + 1));
usleep(adult_t*1000);
adults = fork();
// Adult process is created here
if(adults == 0)
{
handler(getpid(), amt, "adult");
}
else
{
}
}
}
else
{
children = fork();
if (children == 0)
{
for(int i=0; i<=chc-1; i++)
{
int child_t = (random() % (child_max_t + 1));
usleep(child_t*1000);
children = fork();
// Child process is created here
if(children == 0)
{
handler(getpid(), cmt, "child");
break;
}
else
{
}
}
}
else
{
}
}
return 0;
}
void handler(int pid,int maxtime, char* type)
{
sem_wait(entry);
printf("%s %i%s\n",type,pid," attempting to enter...");
if(type == "child")
{
int child_leave_t = (random() % (maxtime + 1));
if((*adults_inside) != 0)
{
if(((*children_inside)+1)/(*adults_inside) <= 3)
{
(*children_inside)++;
printf("%s %i%s\n",type,pid," entered!");
usleep(child_leave_t*1000);
printf("%s %i%s\n",type,pid," left!");
(*children_inside)--;
}
else
{
printf("%s %i%s\n",type,pid," can not enter. Waiting...");
}
}
else
{
printf("%s %i%s\n",type,pid," can not enter. Waiting...");
}
}
else if(type == "adult")
{
(*adults_inside)++;
printf("%s %i%s\n",type,pid," entered.");
}
sem_post(entry);
}
void load_init_values()
{
adults_sem = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, 0, 0);
children_sem = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, 0, 0);
entry = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, 0, 0);
shm_a_id = shmget(IPC_PRIVATE, sizeof(int), IPC_CREAT | IPC_EXCL | 0666);
shm_c_id = shmget(IPC_PRIVATE, sizeof(int), IPC_CREAT | IPC_EXCL | 0666);
adults_inside = (int *) shmat(shm_a_id, NULL, 0);
children_inside = (int *) shmat(shm_c_id, NULL, 0);
sem_init(adults_sem,1,1);
sem_init(children_sem,1,1);
sem_init(entry,1,1);
}
Mã này chỉ mô phỏng tạo quy trình. Có một semaphore được chia sẻ entry
chỉ cho phép một quy trình tại thời điểm yêu cầu nhập. Biến bộ nhớ chia sẻ adults_inside
và children_inside
theo dõi trạng thái bên trong.
Vấn đề của tôi về cơ bản nằm ở hàm xử lý. Sau khi điều kiện không cho phép con nhập vào được kích hoạt, tôi không thể tìm ra cách để thực hiện chờ đợi thụ động. Tôi đã suy nghĩ về việc sử dụng hệ thống pause()
gọi và lưu trữ các quá trình chờ đợi trong hàng đợi, nhưng có vẻ khá kém hiệu quả. Tôi nên chọn phương pháp nào?
Âm thanh như biến điều kiện là những gì bạn đang tìm kiếm, hãy kiểm tra chủ đề này: http://stackoverflow.com/questions/20772476/when-to-use-pthread-conditional-variables – Rogus
Sử dụng '_t' trên sự kết thúc của biến _names_ là bất thường trong cùng cực, và sẽ dẫn đến sự nhầm lẫn. Hậu tố được sử dụng chủ yếu cho các tên kiểu ('uint8_t',' uintptr_t', 'intmax_t', vv từ tiêu chuẩn C; nhiều tên hơn từ POSIX). Nó không sai; nó chỉ là lời mời gây nhầm lẫn. –
Bạn đang tìm kiếm các quy trình con (đôi khi để mô phỏng trẻ em trong trung tâm chăm sóc trẻ em). Điều đó có nghĩa là các cơ chế đồng bộ hóa dựa trên luồng POSIX không có sẵn. Bạn nên suy nghĩ rất kỹ về cấu trúc quy trình mà bạn đang theo đuổi. –