Многопоточность в C с CLion (Windows) - PullRequest
0 голосов
/ 25 марта 2020

У меня есть фрагмент кода, который действительно занимает много времени (~ 2 с) и может быть выполнен без завершения последнего.

for (x = last; x <= end && !found; x++) {
  found = combine(combinaciones, x, end, &current);
}

Обратите внимание, что combine() это функция, которой я был говоря о. Но прежде чем l oop снова запустится (это внутри другого l oop), все функции должны быть завершены.

Также, combine() получает некоторые аргументы, combinaciones это указатель, и current целое число (по ссылке). Целое число изменяется с течением времени (и должно изменяться в других активных функциях), а combinaciones это связанный список (размер которого current-1). 2-й и 3-й аргумент - просто целые числа. Возвращаемое значение - логическое значение, которое завершает l oop, но мне не важно, делают ли они какие-то дополнительные операции.

Я подчеркиваю важность current. Если current равно 5, 5-й элемент combinaciones будет создан, а затем current будет 6. Я имею в виду, что если две функции выделяют память, они не могут выделять одну и ту же позицию.

Если это невозможно, я могу выполнить операции параллельно, а затем выделить память для main().

Итак, я начал искать многопоточность и обнаружил <pthread.h> , но он работал только на Linux (не на CLion). Я нашел что-то, названное вилкой, я тоже не знаю, можно ли его использовать. Не могли бы вы рассказать мне о Windows многопоточном API, с примером и реализацией CLion?

Код огромен, и я не думаю, что это сильно поможет, если я сказал, должно быть достаточно. Однако, если что-то неясно, дайте мне знать. Сам код, опубликованный на GitHub , но (несколько) комментариев, которые он имеет, написаны на испанском sh.

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 25 марта 2020

Используя Wsl (как сказал @Singh) я мог бы использовать pthread.h. Тогда я просто адаптировал свой код. У меня была очень досадная ошибка: идентификаторы (переменная current) назначались не непрерывно (первый поток имел значение «3», а второй - «2»). Я смог исправить это с помощью глобальной переменной (pthread_mutex_t) и pthread_mutex_lock(), pthread_mutex_unlock(). Для получения дополнительной информации вы все еще можете проверить мой код на GitHub .

...