Я пытаюсь реализовать многопоточную игру жизни в c. Программа считывает 2d-массив (A [100] [100]) размером 100x100 из файла, копирует его во второй массив (B [100] [100]) и создает 100 потоков, которым назначена часть 10x10 массива и потоки должны проверять соседние ячейки каждой ячейки (из массива A) и изменять статус в соответствии с правилами в массиве B, когда они заканчивают основную функцию, копирует B в A и запускает aggain от начала, пока пользователь не остановит программа. Моя проблема в том, что потоки только изменяют значения для последней части массива (позиции [90-99] [90-99]). может ли кто-нибудь задуматься о том, что может быть неправильным? (если я использую тот же код, но назначаю весь массив всем потокам, результат правильный, то же самое произойдет, если я использую только один поток)многопоточная игра жизни в c
ответ
Здесь:
int c[5];
for(i=0;i<100;i=i+10){
for(j=0;j<100;j=j+10){
c[0]=i;
c[1]=i+9;
c[2]=j;
c[3]=j+9;
c[4]=k;
err = pthread_create(&(tid[k++]),NULL, &populate, (void *)c);
}
}
Вы передаете один и тот же массив в каждый поток. Таким образом, все потоки будут иметь одинаковые параметры - независимо от того, какие конечные значения c
находятся в конце циклов.
Вместо этого дайте каждому потоку свой собственный c
:
int *c;
for(i=0;i<100;i=i+10){
for(j=0;j<100;j=j+10){
c = malloc(5 * sizeof(*c));
c[0]=i;
c[1]=i+9;
c[2]=j;
c[3]=j+9;
c[4]=k;
err = pthread_create(&(tid[k++]),NULL, &populate, (void *)c);
}
}
работал как шарм, спасибо .. – panos3p
YW. Кроме того, не забудьте 'free()' массивы, когда они больше не используются. –
ваших «has_neighbors» в целом много избыточного кода, который может быть удален либо с объединением rangechecks с проверкой контента,
...
if(i> 0 && j> 0 && A[i-1][j-1]==1) count++;
if(i> 0 && A[i-1][j ]==1) count++;
if(i> 0 && j<99 && A[i-1][j+1]==1) count++;
if( j> 0 && A[i ][j-1]==1) count++;
if( j<99 && A[i ][j+1]==1) count++;
if(i<99 && j> 0 && A[i+1][j-1]==1) count++;
if(i<99 && A[i+1][j ]==1) count++;
if(i<99 && j<99 && A[i+1][j+1]==1) count++;
return count;
}
или с использованием диапазона проверяется подфункции, чтобы вернуть содержание:
int neighbour_value(int i, int j){
if (i<0 || i>99) return 0; /* out of range, never set */
if (j<0 || j>99) return 0; /* out of range, never set */
return A[i,j];
}
, а затем просто проверить с помощью
{
int count = 0;
if(neighbour_value(i-1,j-1)==1) count++;
if(neighbour_value(i-1,j )==1) count++;
if(neighbour_value(i-1,j+1)==1) count++;
if(neighbour_value(i ,j-1)==1) count++;
if(neighbour_value(i ,j+1)==1) count++;
if(neighbour_value(i+1,j-1)==1) count++;
if(neighbour_value(i+1,j )==1) count++;
if(neighbour_value(i+1,j-1)==1) count++;
return count;
}
- 1. Игра жизни в C#
- 2. C Игра жизни вопросы
- 3. Игра жизни Конвея в C
- 4. Игра жизни C++, проверка соседей
- 5. Многопоточная сеть пошаговая игра
- 6. Игра жизни Android Java
- 7. Игра жизни в обработке
- 8. Игра жизни, объекты java
- 9. C# простая игра жизни в WPF
- 10. Игра в проблемы продолжения жизни
- 11. Игра жизни Конвей
- 12. Игра жизни продолжается.
- 13. Игра жизни Конвей - инициализация
- 14. Игра смерти жизни Конвея?
- 15. Игра жизни - Мертвые
- 16. Игра жизни Конвей - правила
- 17. Игра жизни Обработка
- 18. Игра жизни Pygame
- 19. Игра жизни Конвей - JS
- 20. Игра жизни: найти сосед
- 21. Оптимизация коней игра жизни
- 22. Игра жизни Питона Конвея
- 23. Игра жизни, C проверка жизненных условий
- 24. Игра жизни жизни Конвея (следующее поколение)
- 25. Игра жизни Конвей в обработке
- 26. Conways игра жизни в python
- 27. conways игра жизни в рубине
- 28. Создание жизни игра в java
- 29. Интерактивная игра жизни в Java
- 30. Игра Жизни Жизни Конвея не корректируется должным образом
Несвязанной к вашей проблеме: но было бы разумно не использовать константы, такие как '100' и' 99', но '' BOARDSIZE' и BOARDSIZE-1'. Это позволяет вам изменять размер платы в одном месте, и ваш код будет более читабельным. –
Вы пробовали какой-то базовый отладчик ??????? Вы видели внутри того, что происходит внутри памяти, когда вы пытаетесь написать/прочитать/от него? – Leos313
80% из вас "check neighbour" не используется, если вы просто добавили предварительное условие к if. например A [i] [j-1] рассчитывает только, если j> 0, поэтому напишите 'if (j> 0 && A [i] [j-1])', а затем только один раз. нужен только последний блок else (с добавленными предварительными условиями) – Tommylee2k