多线程 getline 问题 在线等
// test.c
#include <pthread.h>
#include <stdio.h>
pthread_mutex_t the_mutex;
void* routine(void *arg)
{
char *line = NULL;
size_t len = 0;
size_t nread = 0;
pthread_mutex_lock(&the_mutex);
while ((nread = getline(&line, &len, stdin)) != -1) {
pthread_mutex_unlock(&the_mutex);
printf("%s", (char*)arg);
// sleep(1);
}
}
int main(void)
{
pthread_mutex_init(&the_mutex, NULL);
int tid1, tid2;
void *tret;
pthread_create(&tid1, NULL, routine, (void*)"111");
pthread_create(&tid2, NULL, routine, (void*)"222");
pthread_join(tid1, &tret);
pthread_join(tid2, &tret);
}
我的目的是将来通过 cat 1.txt | ./test 方式运行,希望通过两个线程去读管道左边的输入,每次读一行。但是好像只有一个线程在运作,另一个线程根本不运作(通过打印来看),开始以为是巧合,但是经过大量测试,问题依然存在。而且在加sleep函数后,都不输出了,就卡在那里了,不知道,什么原因。请大家帮忙看看。
[解决办法]
void* routine(void *arg)
{
char *line = NULL;
size_t len = 0;
size_t nread = 0;
while(1){
pthread_mutex_lock(&the_mutex);
if ((nread = getline(&line, &len, stdin)) == -1) {
pthread_mutex_unlock(&the_mutex);
break;
}
printf("%s", (char*)arg);
pthread_mutex_unlock(&the_mutex);
sleep(1);
}
}
[解决办法]
第一个问题应该和线程调度有关;找个大一点的文件测试,会发现两个线程还是交替运行的。
想让一个线程让出CPU,最好使用 pthread_yield();使用 sleep()不敢保证没有问题。
// test.c#include <pthread.h>#include <stdio.h>pthread_mutex_t the_mutex;void* routine(void *arg){ char *line = NULL; size_t len = 0; size_t nread = 0; pthread_mutex_lock(&the_mutex); printf("get the lock for %s\n", (char *)arg); while ((nread = getline(&line, &len, stdin)) != -1) { pthread_mutex_unlock(&the_mutex); printf("%s", (char*)arg); pthread_yield(); pthread_mutex_lock(&the_mutex); } pthread_mutex_unlock(&the_mutex);}int main(void){ pthread_mutex_init(&the_mutex, NULL); int tid1, tid2; void *tret; pthread_create(&tid1, NULL, routine, (void*)"111"); pthread_create(&tid2, NULL, routine, (void*)"222"); pthread_join(tid1, &tret); pthread_join(tid2, &tret);}
[解决办法]
我看了很久,也看了上面几位大神的回答,我觉得没有那么复杂把! 楼主想从打印来看,可是你用printf没有加换行符.