Nel seguente esempio di codice, i processi sono assegnati a diversi contesti. E ogni oggetto App sarà associato a un solo contesto. Sebbene tutti i processi eseguano lo stesso codice, solo quelli appartenenti al contesto eseguiranno i metodi di App. Per implementare questo obiettivo, come mostrato nel codice, devo aggiungere l'istruzione di controllo if
in ogni metodo della classe App da verificare. Quindi la mia domanda: ci sono alcuni modi eleganti per fare lo stesso lavoro come modelli di progettazione o pratiche di codice?
class Context {
public:
Context(int num_procs);
bool ContainsCurrentProcess();
...
private:
std::vector<int> procs_;
...
};
bool Context::ContainsCurrentProcess() {
if (current_process_id belongs to procs_ )
return true;
else
return false;
}
class App {
public:
App(Context *ctx, ...) {}
void Method1();
void Method2();
void Method3();
...
private:
Context *ctx_;
...
};
void App::Method1() {
if (ctx_->ContainsCurrentProcess()) {
...
}
}
void App::Method2() {
if (ctx_->ContainsCurrentProcess()) {
...
}
}
void App::Method3() {
if (ctx_->ContainsCurrentProcess()) {
...
}
}
// In the parallel program, all processes will run the following code.
// However, each processes can have different behaviors based on their process IDs.
int main() {
// Assume we have 8 processes
Context ctx1(4); // Assign process 0, 1, 2, 3 to ctx1.
Context ctx2(4); // Assign process 4, 5, 6, 7 to ctx2.
App app1(ctx1, ...);
App app2(ctx2, ...);
// The app1 and app2 will use different groups of processes concurrently.
app1.Method1();
app2.Method2();
}