Tôi đã xem bài đăng tương tự duy nhất tôi có thể tìm thấy, nhưng đó không phải là những gì tôi đang tìm kiếm.Sử dụng bộ nhớ dùng chung với fork()
Về cơ bản, tôi đang cố gắng chạy số Odd-Even Sort với forking, do đó, con chạy tỷ lệ cược và cha mẹ sẽ chạy quảng cáo. Cả hai yêu cầu chia sẻ của inputValues vector, cũng như các boolean được sắp xếp.
Các mã sau đây là không có bất kỳ nỗ lực thất bại của tôi lúc chia sẻ bộ nhớ, và chỉ là khuôn khổ cơ bản cho việc sử dụng dĩa với các thuật toán tìm kiếm:
while(!sorted)
{
pID = fork();
sorted = true;
cout << "Sort set to TRUE." << endl;
if(pID == 0)
{
int num = 1;
cout << "Child swap run" << endl;
Swap((void *) num);
cout << "Status: " << ((sorted) ? "SORTED" : "UNSORTED") << endl;
exit(0);
}
else if(pID < 0)
{
cout << "Failed to fork." << endl;
exit(1);
}
else
{
wpid = waitpid(pID, &status, waitStatus);
int num = 0;
cout << "Parent swap run" << endl;
Swap((void *) num);
cout << "Status: " << ((sorted) ? "SORTED" : "UNSORTED") << endl;
}
}
Tôi đã thử nhiều cách hack ra chia sẻ này bộ nhớ, nhưng không thể tìm thấy bất kỳ tài nguyên nào thực sự giải thích CÁCH nó hoạt động, những gì tôi cần và cách tốt nhất để làm điều đó.
Vì vậy, yêu cầu của tôi như sau:
- Cha mẹ và con phải có khả năng chia sẻ và thao tác một vector toàn cầu và boolean
- này phải có khả năng chạy trong một vòng lặp, như
- Điều này phải hoạt động với các biến được sử dụng trong hàm main() và trong hàm hoán đổi()
Nếu bạn có bất kỳ mẹo nào, tôi đánh giá cao chúng. Cảm ơn!
Hãy xem trang người dùng cho lệnh gọi API 'shm_open' POSIX. Bạn muốn tạo một vùng nhớ chia sẻ và đặt bất kỳ biến nào được truy cập bởi cả hai quy trình ở đó. Bạn cũng có thể làm điều này với cuộc gọi 'mmap' khá dễ dàng. Hãy chắc chắn để làm cho truy cập của bạn an toàn thread ... Không có khóa vốn có trong việc sử dụng bộ nhớ chia sẻ, vì vậy bạn phải chăm sóc. – Borealid
Hãy nhớ với 'shm_open' bạn sẽ cần phải gọi' ftruncate' để phân bổ không gian cho đối tượng bộ nhớ chia sẻ, do đó, một lần nữa, khoảng trống trong đối tượng bộ nhớ sẽ không phát triển tự động như bạn thấy với 'std :: vectơ'. Bạn sẽ phải tự quản lý kích thước của đối tượng bộ nhớ chia sẻ khi chạy nếu bạn cần nhiều không gian hơn. – Jason
Điều này khá rõ ràng không phải là mã C. – Puppy