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