c 多线程

标签 c multithreading pthreads

我的线程中有一个奇怪的行为:

void * foo(void * nic){
    printf("foo");
}
void * threadF(void * pointer){
    printf("1\n");
    pthread_t threadT;
    pthread_attr_t attr;
    pthread_attr_init (&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
    pthread_create(&threadT,NULL,&foo,(void*)NULL);
    printf("2\n");
    while (!feof(stdin)){
        int id, in, out;
        fscanf(stdin,"%d:%d:%d",&id,&in,&out);
    }
}

int main(){
    pthread_attr_t attr;
    pthread_attr_init (&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
    pthread_t threadT;
    pthread_create(&vlaknoVstupu,&attr,&threadF,(void*)&data);
    pthread_join(threadT,NULL);
    pthread_attr_destroy (&attr);
}
// I skipped irelevant parts of code...

问题是有时输出是 12foo,但通常只是 12。 然后函数等待输入。我希望它总是 12foo。有谁知道为什么我的期望是错误的?

编辑:当我输入一些像 1:1:1 这样的输入时,这会导致再次经历 while 循环,始终是 foo 输出。

最佳答案

Printf 没有线程保证。您不应该只从不同的线程对同一事物调用两个函数,除非明确保证它是安全的,无论是作者还是您自己编写的。

你应该做的是存储一个字符串指针缓冲区,并使用原子操作将字符串插入到这个缓冲区中,然后每隔一段时间打印所有这些字符串,释放内存,设置为空,或者如果它是可以让子线程等待 printf 调用。

关于c 多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2704458/

相关文章:

java - 当应用程序处于后台时 Thread.sleep 速度变慢

c++ - 为什么 std::mutex 需要很长时间才能共享?

c - K&R C 函数指针

c - 如何将 Bullseye 代码覆盖率添加到使用 gcc 编译的代码中

java - 使线程跳过从其他线程读取输入操作

c - C中的父线程通知子线程

c++ - 在 For 循环中创建多个线程来处理二维数组

c - 使用 open()、read() 和 write() 系统调用复制文件

c - 有没有办法从 C 应用程序与驱动程序通信?

objective-c - 将实例方法作为函数指针传递给 C 库