Я хотел написать комментарий об альтернативном подходе, чтобы сделать ваш код легче управлять, но это было долго ... так что подумайте об этом скорее в качестве совета, затем в ответ.
Начну с изучения некоторых проблем с вашим кодом, надеюсь, отвечая на исходный вопрос.
Затем я продемонстрирую альтернативный подход, используя struct
. Этот альтернативный подход легче координировать и поддерживать с течением времени.
Ваш код имеет несколько проблем, которые могут привести к компиляции и выполнения ошибки, вот несколько примеров, которые должны указать вам правильный путь:
Ваше int
задание не выполняет то, что вы, возможно, хотел или предназначил его для выполнения.
Ваш код присваивает числовое значение адреса указателя целому числу, возможно, обрезает данные из-за различий в размерах переменных. То, что вы, вероятно, хотели, было хранить указатель на int.
Вы писали:
int a = malloc(sizeof(int));
int b = malloc(sizeof(int));
Вы, вероятно, хотели написать:
int * a = malloc(sizeof(int));
int * b = malloc(sizeof(int));
Ваш код обрабатывает void *
как void **
(или int *
) без использования каких-либо литья ...
Вы писали:
int start = *((int *)args[0]);
int end = ((int *)args)[1];
вероятно Вы имели в виду, чтобы написать:
int start = ((int *)args)[0];
int end = ((int *)args)[1];
Ваш код выполняет malloc
три (3) раза, но никогда не называет free
(у вас есть утечка памяти).
Эти проблемы с орфографией чаще встречаются при попытке создания сложных структур данных вручную.
Было бы проще, если бы вы определили struct
, чтобы содержать данные, которые вы хотели «переместить» в (или поделиться) с потоком.
Например, следующий непроверенного код, вероятно, не работает, но он четко показывает концепцию того, как с помощью передачи данных struct
делает легче управлять, поддерживать и обновлять. Он также требует меньше вызовов malloc
, что упрощает управление памятью.
struct ThreadData {
int start;
int end;
};
void * thread_task(void *);
int main(void) {
struct ThreadData * data = malloc(sizeof(*data));
data->start = 0;
data->end = 0; // = size;
pthread_t thr;
pthread_create(&thr, NULL, thread_task, data);
// ... do whatever.
// ... remember to join thread
}
void * thread_task(void * _data) {
struct ThreadData * data = _data;
printf("Start: %d, End: %d\n", data->start, data->end);
// remember to free the memory when you're done.
free(data);
return NULL;
}
Этот подход намного проще как для кодирования, так и для поддержания. Кроме того, когда вам нужно добавить данные для нового потока, это просто - просто обновите структуру.
Вы можете даже вернуть комплексные возвращаемые значения обратно в держатели места в структуре, позволяя потоку выполнять более сложные задачи (не забудьте избежать более одного потока, записывающего одно и то же поле struct
).
Добро пожаловать в Переполнение стека. Обратите внимание, что предпочтительный способ сказать «спасибо» здесь ответы на вопросы и полезные ответы (если у вас достаточно репутации, чтобы сделать это), и, приняв наиболее полезный ответ на любой заданный вами вопрос (что также дает вам небольшой импульс для вашей репутации ). См. Страницу [About], а также [Как задать вопросы здесь?] (Http://stackoverflow.com/help/how-to-ask) и [Что мне делать, когда кто-то отвечает на мой вопрос ? ?] (http://stackoverflow.com/help/someone-answers) –
Почему вы устанавливаете значения 'a' и' b' для значений return by 'malloc', а затем устанавливаете их на что-то еще, утечка выделенной памяти? –