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

标签 c pthreads

我正在使用 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>

关于c - 为什么我的线程在第二次运行打印一行后停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65849631/

相关文章:

c++ - sleep 限制了线程性能

c - SW-Serial.exe 中 0x012219c4 处的未处理异常

c - 第二个线程没有从 cond_wait 中唤醒

c++ - C++ 所需的具有 C 链接的回调函数

c++:PThread 调度与 Windows 线程

php - 检测按顺序完成的线程

c - 如何使我在c中使用的函数由变量控制

c - 如何使用 Visual Studio 调试 SQLite 源代码

c++ - 从 const char* 参数中取出一个索引

用 C 代码编写基于 TCP 的 FTP 服务