以下计划:
#include <stdio.h>
#include <pthread.h>
char input;
void *
dpy(void *args)
{
printf("\n[input] = %c\n", input);
}
void *
read(void *args)
{
pthread_t child;
printf("Write whatever - press 'F' to end\n");
do
{
scanf("%c", &input);
printf("begin\n");
pthread_create(&child, NULL, dpy, NULL);
pthread_join(child, NULL);
printf("end\n");
}
while (input!='F');
printf("done\n");
}
void
main ()
{
pthread_t parent;
pthread_create(&parent, NULL, read, NULL);
pthread_join(parent, NULL);
}
parent
主题。[input] = ..
,
使用child
主题。每条消息都有以下模式:
开始..结束
在scanf
调用之后(在read
例程的循环内)显示两次,尽管它应该等待下一个scanf
调用的下一个字符输入。
有什么想法吗?
答案 0 :(得分:1)
除了scanf()离开换行的问题之外,还有一些小问题。
线程功能&#39;原型要求他们返回一个指针。因此read()
和child()
最后必须有return NULL;
(或者必要时还有其他值 - 但我不认为您有此需要)。
void main()
是main()
的非标准原型。使用int main(void)
或同等的。
您还应该检查pthread_*
函数的返回值;他们可能会失败!
在scanf(scanf(" %c", &input);
)中有一个前导空格会忽略输入中的任何个空格数。因此,它会消耗前一个输入留下的换行符。但总的来说,最好避免使用scanf,而是选择fgets()
。见Why does everyone say not to use scanf? What should I use instead?