Не передавайте указатель на i
, передавайте значение , хранящееся в самом i
:
void print_message(void *param)
{
int thread_counter = (intptr_t)param;
printf("Thread #%i\r\n", thread_counter);
_endthreadex(0);
}
// ... rest of code ...
// We cast the value in i to a pointer width integer value, intptr_t
// to explicitly match the size of the void* we're smuggling it in
thread_handles[i] = (HANDLE)_beginthreadex(NULL, 0, &print_message, (void*)(intptr_t)i, 0, &thread_ID);
// ... rest of code ...
Если все, что выПередача является единственным, меньшим, чем значение ширины указателя, вы можете переправить его значение как само значение «указателя».В этом случае вы просто повышаете его до intptr_t
(целочисленный тип, соответствующий ширине указателя) и понижаете его при извлечении.
Поскольку передается фактическое значение, а не указатель на него,Копирование выполняется до вызова _beginthreadex
, а изменение i
после этого ничего не меняет.
Если передаваемые данные больше, то вы застряли либо наложив какой-либо барьер (чтобы убедиться, что значение прочитано до того, как основной поток снова коснется i
) или с использованием динамической памяти (выделите пространство, скопируйте значения, передайте указатель на выделенную память потоку, поток извлечет значения перед освобождением пространства).Третий параметр - это массив значений, по одному для каждого потока (поэтому первый поток получает &arr[i]
, где i
равен 0
, следующий &arr[i]
для i == 1
и т. Д.).