Распечатка четных и нечетных чисел, используя нить в C
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void* thread_even(void* arg);
void* thread_odd(void* arg);
int main(int argc, char** argv) {
pthread_t tid[2];
pthread_create(&tid[0], 0, &thread_even, 0);
pthread_create(&tid[1], 0, &thread_odd, 0);
pthread_join(tid[0], NULL);
pthread_join(tid[1], NULL);
return 0;
}
void* thread_even(void* arg) {
int* thread_id = (int*)arg;
pthread_mutex_lock(&mutex);
for(int i = 1; i <= *thread_id; i++)
{
if(i%2 != 0)
{
printf("Thread 1: %d", i);
}
}
pthread_mutex_unlock(&mutex);
return NULL;
}
void* thread_odd(void* arg) {
int* thread_id = (int*)arg;
pthread_mutex_lock(&mutex);
for(int i = 1; i <= *thread_id; i++)
{
if(i%2 == 0)
{
printf("Thread 2: %d", i);
}
}
pthread_mutex_unlock(&mutex);
return NULL;
}
Выше приведен код, над которым я работаю, но я получаю сообщение об ошибке сегмента... Например, я хочу добиться
когда я компилирую его и запускаю с аргументом 8 (./number 8)
это должно распечатать
нить 1: 1
нить 2: 2
нить 1: 3
... и т.д. до числа 8.
в котором поток 1s должен представлять четные числа, а поток 2s - нечетные числа.
Пожалуйста, помогите... Я хочу расширить свои знания о Си, но не с кем спросить.. Спасибо.
1 ответ
Похоже, вы проходите 0
AKA NULL
до последнего параметра pthread_create
и затем делать следующее:
int* thread_id = (int*)arg;
pthread_mutex_lock(&mutex);
for(int i = 1; i <= *thread_id; i++)
Так, thread_id
конечно будет NULL
Ссылка на него будет SEGFAULT.
Если вы хотите передать верхнюю границу для каждого потока, чтобы выполнить, вы можете сделать что-то вроде этого:
int main(int argc, char** argv) {
pthread_t tid[2];
int *ids = malloc(2 * sizeof(int));
ids[0] = 10; /* upper bound for thread 1 */
ids[1] = 10; /* upper bound for thread 2 */
pthread_create(&tid[0], 0, &thread_even, &ids[0]);
pthread_create(&tid[1], 0, &thread_odd, &ids[1]);
pthread_join(tid[0], NULL);
pthread_join(tid[1], NULL);
free(ids);
return 0;
}
Есть способы сделать это, не прибегая к распределению кучи, но это самый прямой путь.