2016-08-02 3 views
0

Существует процесс, который запускает 100 процессов:Как правильно установить свойства одновременно в SimGrid?

for (int i = 0; i < 100; ++i) { 
     MSG_process_create("w", executor, NULL, MSG_host_self()); 
    } 

исполнитель создает задание образца и выполнить его. Таким образом, существует 100 процессов, которые одновременно запускают задачу и завершают ее выполнение одновременно. Для контроля количества процессов у меня void plusOneActiveProcess() и void minusOneActiveProcess():

Из-за все executor процессов запускаются одновременно все в порядке:

[ 0.000000] (2:[email protected]) Active process amount is 1 
[ 0.000000] (3:[email protected]) Active process amount is 2 
[ 0.000000] (4:[email protected]) Active process amount is 3 
.................................................... 
[ 0.000000] (101:[email protected]) Active process amount is 100 

Каждый из процессов должен уменьшаться (как я ожидал) шаг за шагом количеством активного процессы, когда executor завершено для выполнения задачи. Но этого не произошло:

[100.000000] (101:[email protected]) Active process amount is 99 
[100.000000] (2:[email protected]) Active process amount is 99 
[100.000000] (3:[email protected]) Active process amount is 99 
.................................................... 
[100.000000] (100:[email protected]) Active process amount is 99 

Как это сделать правильно?

Это код функции plusOneActiveProcess(), minusOneActiveProcess, executor():

int executor(){ 
    plusOneActiveProcess(); 
    msg_error_t a = MSG_task_execute(MSG_task_create("", 1e9, 0, NULL)); 
    minusOneActiveProcess(); 
    MSG_process_kill(MSG_process_self()); 
    return 0; 
} 

void plusOneActiveProcess(){ 
    char kot[50]; 
    long number; 
    number = xbt_str_parse_int(MSG_host_get_property_value(MSG_host_self(), "activeProcess"), "error"); 
    number++; 
    sprintf(kot, "%ld", number); 
    MSG_host_set_property_value(MSG_host_self(), "activeProcess", xbt_strdup(kot), NULL); 
    XBT_INFO("Active process amount is %s", MSG_host_get_property_value(MSG_host_self(), "activeProcess")); 
    memset(kot, 0, 50); 
} 

void minusOneActiveProcess(){ 
    char kot[50]; 
    long number; 
    number = xbt_str_parse_int(MSG_host_get_property_value(MSG_host_self(), "activeProcess"), "error"); 
    number--; 
    sprintf(kot, "%ld", number); 
    MSG_host_set_property_value(MSG_host_self(), "activeProcess", xbt_strdup(kot), NULL); 
    //XBT_INFO("Active process amount is %s", MSG_host_get_property_value(MSG_host_self(), "activeProcess")); 
    memset(kot, 0, 50); 
} 

ответ

1

Ага, это интересно. Дело в том, что set_property() является SimGrid simcall, поэтому у вас есть гарантия, что все вызовы set_property() всегда будут линеаризованы в том же порядке. Но get_property() является регулярным вызовом функции, который возвращает значение в начале раунда планирования. Поскольку все процессы запрашивают значение в одном раунде планирования, все они получают одно и то же значение (что равно 100), уменьшают его, а затем делают simcall для ввода нового значения (все процессы хотят нажать 99).

Вы хотите, чтобы get + set атомал, то есть убедитесь, что любой процесс подталкивает обновленное значение, прежде чем кто-то сделает get_property(). Для этого я советую использовать MutexS SimGrid или что-то в этом роде.

Смежные вопросы