使用C中的线程打印出偶数和奇数

时间:2017-06-01 17:17:24

标签: c pthreads computer-science

#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代表奇数。

请帮忙......我想发展我对C的了解,但没有人问... 感谢。

1 个答案:

答案 0 :(得分:0)

您似乎正在将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;
}

如果不采用堆分配,有很多方法可以做到这一点,但这是最直接的。