为什么我的线程在其第二 运行 打印一行后停止?

Why does my thread stop after printing one line on its second run?

我正在使用 pthreads,我正在尝试 运行 主线程上的无限循环。该循环应该打印出“Hello world!” 10 次,然后创建一个单独的线程,写入“Hello moon!” 10次​​,然后重新开始。

出于某种原因,我的程序输出(总是):

Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
Hello moon!
Hello moon!
Hello moon!
Hello moon!
Hello moon!
Hello moon!
Hello moon!
Hello moon!
Hello moon!
Hello moon!
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
Hello moon!

而不是运行永远宁。

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>

#define SEC_IN_NSEC(x) (x * 1000000000)

pthread_mutex_t mutex;

void *hello_moon(void *param);

int main(int argc, char **argv)
{
    pthread_t moon_tid;

    pthread_mutex_init(&mutex, NULL);

    while(1) {
        
        pthread_mutex_lock(&mutex);

        for(int i = 0; i < 10; i++) {
            printf("Hello world!\n");
            sleep(1);
        }

        pthread_mutex_unlock(&mutex);

        pthread_create(&moon_tid, NULL, hello_moon, NULL);
        pthread_join(moon_tid, NULL);
    }

    pthread_mutex_destroy(&mutex);
}

void* hello_moon(void *param)
{
    struct timespec ts;
    ts.tv_nsec = SEC_IN_NSEC(0.2); // 0.2 s in ns
    
    pthread_mutex_lock(&mutex);

    for(int i = 0; i < 10; i++) {
        printf("Hello moon!\n");
        nanosleep(&ts, NULL);
    }

    pthread_mutex_unlock(&mutex);
    pthread_exit(0);
}

有人知道为什么会这样吗?

更新:我注释掉了 sleep 和 nanosleep 调用并 运行 它,然后它按预期循环。但是,我仍然想要打印之间的延迟。

正如@KamilCuk 在评论中指出的,您忘记初始化 tv_sec 成员:

struct timespec ts;
ts.tv_sec = 0; // add this, otherwise the member can be initialized with garbage
ts.tv_nsec = SEC_IN_NSEC(0.2); // 0.2 s in ns

还有,你漏了一个header,在文件开头加上:

#define _POSIX_C_SOURCE 200809L
#include <time.h>