当前位置: 技术问答>linux和unix
多线程 getline 问题 在线等
来源: 互联网 发布时间:2017-02-15
本文导语: // test.c #include #include 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)...
// test.c
#include
#include
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函数后,都不输出了,就卡在那里了,不知道,什么原因。请大家帮忙看看。
#include
#include
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);
}
}
{
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
#include
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 %sn", (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没有加换行符.