2010-04-24 27 views
0

有一个在我的线程怪异的行为:ç多线程

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

回答

2

Printf没有线程保证。除非作者明确保证是安全的,否则你不应该仅仅从不同的线程调用两个函数,或者由你自己编写它。

你应该做的是存储字符串指针的缓冲区,并用原子操作插入串到这个缓冲区,然后printf的所有的人每天的如此频繁,释放内存,设置为空,或者只使用一个锁,如果可以让子线程等待printf调用。

+0

谢谢,这有帮助。 – coubeatczech 2010-04-24 14:33:42

0

由于线程foo没有联接调用,程序可能会在运行前结束。

+0

当我读取输出时的状态是该进程仍在运行并等待输入.'while(!feof(stdin)){...}' 'while'仍然没有改变任何东西。 – coubeatczech 2010-04-24 13:16:03

1

会发生什么(在大多数实现中)stdin和stdout绑定在一个实际的缓冲区中。这是为了让这样的:

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

工作很好,输入的字符将在printf的文本之后出现。

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

如果你从控制台调用程序,输入类似1:2:3的东西,然后回车,你会看到foo将显示在最后。