Распечатка четных и нечетных чисел, используя нить в 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;
}

Есть способы сделать это, не прибегая к распределению кучи, но это самый прямой путь.

Другие вопросы по тегам