【问题标题】:c multithreadingc 多线程
【发布时间】:2010-04-24 12:34:25
【问题描述】:

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

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 输出。 p>

【问题讨论】:

    标签: c multithreading pthreads


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      发生的情况是(在大多数实现中)stdin 和 stdout 在一个实际的缓冲区中捆绑在一起。这是为了允许这样的事情:

      printf("Input: ");
      scanf("%d", &integer);
      

      为了更好地工作,输入的字符将出现在 printf 文本之后。

      只要您的 scanf 将获取标准输入,这将“锁定”该缓冲区,同时阻止其他线程的标准输出将其数据刷新到屏幕。请注意“锁定”。不一定意味着真正的线程锁。

      如果您从控制台调用程序,输入类似 1:2:3 的内容,然后按 Enter,您会看到 foo 将显示在末尾。

      【讨论】:

        【解决方案3】:

        由于线程foo没有加入调用,程序可能在运行之前就结束了。

        【讨论】:

        • 我在读取输出时的状态是进程仍在运行并等待输入。while(!feof(stdin)){...}while 之后添加一个带有连接的行仍然没有任何改变。
        猜你喜欢
        • 1970-01-01
        • 2011-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多