Редактирование значений членов экземпляра структуры внутри одного / нескольких потоков - PullRequest
0 голосов
/ 02 августа 2020
• 1000 1004 *. Я не знаю, как этого можно достичь, или, если возможно, приведенный мной пример показывает, как далеко я продвинулся. Требуется ли разыменование указателя lpParameter? Или есть способ, которым я могу отредактировать структуру, которая является потокобезопасной?

Пример / нежелательный вывод кода:

a.val before edit: 5
a.val after edit: 5

Ожидаемый / желаемый результат (вывод, который я пытаюсь достичь):

a.val before edit: 5
a.val after edit: 20

Мой общий вопрос заключается в том, как я могу указать на экземпляр структуры object a, чтобы я мог редактировать значения членов a внутри edit_obj резьба?

1 Ответ

2 голосов
/ 02 августа 2020

Есть две проблемы с вашим кодом:

  1. Функция edit_obj не изменяет объект a функции main, а скорее его копию.
  2. Даже если бы # 1 был исправлен, у вас все равно было бы состояние гонки . После вызова CreateThread вы не ждете, пока поток завершит sh свою работу. Следовательно, в зависимости от того, завершено оно или нет, следующая строка printf может напечатать измененное или немодифицированное значение объекта. Чтобы исправить это, вы должны вызвать WaitForSingleObject в потоке.

Чтобы исправить № 1, вы можете написать следующее:

DWORD WINAPI edit_obj(LPVOID *lpParameter) {
   ((object*)lpParameter)->val = 20;

    return 0;
}

Чтобы исправить № 2, вы можете напишите следующее:

int main() {
    [...]

    HANDLE hThread = CreateThread(0, 0, edit_obj, &a, 0, 0);
    WaitForSingleObject( hThread, INFINITE );
    CloseHandle( hThread );
    printf("a.val after edit: %d\n", a.val);

}
...