Một tùy chọn là có cả quy trình chính và quy trình tạo các phiên bản của cùng một đối tượng. Bởi vì quy trình tổng thể sẽ là người duy nhất để sửa đổi đối tượng 'chia sẻ' này, nó chỉ phải cảnh báo các quy trình nô lệ đối với bất kỳ thay đổi nào mà nó làm cho đối tượng 'được chia sẻ'. Để thực hiện việc này, bạn có thể thiết lập một hệ thống nhắn tin mà quy trình tổng thể sẽ sử dụng để truyền đạt các thay đổi cho đối tượng được chia sẻ với các quy trình nô lệ. Hạn chế ở đây là các quá trình nô lệ có thể tham chiếu đến đối tượng được chia sẻ khi nó không đồng bộ với chủ, nhưng đây là một vấn đề phổ biến trong việc sao chép. Ngoài ra, bạn có thể sử dụng lớp phủ RPC để làm cho các ứng dụng chính/nô lệ dễ dàng hơn trong việc phát triển/duy trì.
Tôi sẽ cố gắng cung cấp một ví dụ cấp cao về thiết kế này bên dưới.Tha thứ cho tôi vì sử dụng mã thực và mã psuedo song song; Tôi không muốn hoàn toàn mã này, nhưng cũng không muốn nó chỉ được tạo thành từ ý kiến :)
Dưới đây là đối tượng chia sẻ của chúng tôi mà được định nghĩa trong cả mã master/slave
struct sharedobj {
int var1;
};
Dưới đây là ví dụ về quy trình tổng thể cập nhật đối tượng được chia sẻ và truyền các thay đổi
int counter = 0;
sharedobj mysharedobj;
while(true){
//update the local version first
mysharedobj.var1 = counter++;
//then call some function to push these changes to the slaves
updateSharedObj(mysharedobj);
}
Đây là chức năng truyền các thay đổi của chủ nhân cho nô lệ;
updatedSharedObj(sharedobj obj){
//set up some sort of message that encompasses these changes
string msg = "var1:" + the string value of obj.var1;
//go through the set of slave processes
//if we've just done basic messaging, maybe we have a socket open for each process
while(socketit != socketlist.end()){
//send message to slave
send(*socketit, msg.c_str(),msg.length(),0);
}
}
Và đây là mã nô lệ nhận các thay đổi này và cập nhật đối tượng 'được chia sẻ'; rất có thể chạy trong một thread khác để slave có thể chạy mà không cần phải dừng lại và kiểm tra các cập nhật đối tượng.
while(true){
//wait on the socket for updates
read(mysock,msgbuf,msgbufsize,0);
//parse the msgbuf
int newv1 = the int value of var1 from the msg;
//if we're in another thread we need to synchronize access to the object between
//update thread and slave
pthread_mutex_lock(&objlock);
//update the value of var1
sharedobj.var1 = newv1;
//and release the lock
pthread_mutex_unlock(&objlock);
}
tôi đã không sử dụng nó, nhưng bạn không đề cập được nhận thức của [Boost.Interprocess] (http: //www.boost. org/doc/libs/1_53_0/doc/html/interprocess.html). – BoBTFish
Bạn có thể muốn tìm kiếm 'bộ nhớ chia sẻ'. [Đây là một câu hỏi về SO] (http://stackoverflow.com/questions/5656530/how-to-use-shared-memory-with-linux-in-c) nhưng đối với 'C' (phù thủy cũng có thể làm việc cho C++) – A4L