C 程序卡住,不进入 main()
C Program is stuck, doesnt enter main()
我正在尝试 运行 一个程序,其中一个线程从标准输入获取数据,然后另一个线程在标准输出上提供数据,没有什么太复杂,但是当我 运行 我的程序使用 /.filename < test.in > test.out 它什么都不做。当我使用 gcc -pthread filename.c -o filename -W -Wall 编译它时,似乎没有错误或警告。有人可以解释吗?同样在文件 test.out 中没有显示任何内容,在 test.in 中是一个简单的句子。
这是节目
#define V 300
pthread_cond_t cond;
pthread_mutex_t mutex;
char a[300];
int p = 0;
int w = 0;
void *thread1() {
while(1){
pthread_mutex_lock(&mutex);
printf("thread1");
while(p >0){
pthread_cond_wait(&cond, &mutex);
}
p = fread(a, sizeof(char), V ,stdin);
if(p == 0){
pthread_exit(NULL);
}
if(p <= V){
pthread_cond_signal(&cond);
}
pthread_mutex_unlock(&mutex);
}
}
void *thread2() {
while(1){
pthread_mutex_lock(&mutex);
printf("thread2");
while(w >0){
pthread_cond_wait(&cond, &mutex);
}
w = fwrite(a, sizeof(char),p, stdout);
if(w == 0){
pthread_exit(NULL);
}
if(w <= V ){
pthread_cond_signal(&cond);
}
pthread_mutex_unlock(&mutex);
}
}
int main (void) {
printf("main/n");
fflush(stdout);
pthread_t t1, t2;
pthread_mutex_init(&mutex, NULL);
pthread_cond_init (&cond, NULL);
pthread_create(&t1, NULL, vlakno1, NULL);
pthread_create(&t2, NULL, vlakno2, NULL);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
return 0;
}
由于 printf("main/n");
中的拼写错误,您在终端上看不到任何内容
printf
的输出不会刷新到 stdout
并且创建的线程会永远消耗循环,或者至少会消耗很长时间。
您应该在 printf
语句之后添加 fflush(stdout);
以验证这一点。
然后你可以尝试 printf("main\n");
没有 fflush()
来验证 stdout
是行缓冲的,即:当输出换行符时输出被刷新到终端。
如果您将输出重定向到一个文件,stdout
通常是完全缓冲的,因此您应该在每个输出操作之后添加一个显式的 fflush(stdout);
,这样您就可以在输出文件中看到输出fly 或者杀掉程序后。
请注意,如果您使用英文单词作为标识符、类型、注释和消息,代码将更易于此处的大多数用户阅读。
您的 printf("main/n");
而不是 printf("main\n");
(或只是 puts("main");
)中有明显的拼写错误,但这是一个细节,而不是您的程序永远无法完成的原因
在 vlakno1 中你创建了一个死锁:
if(poc_precitanych == 0){
pthread_exit(NULL);
}
因为你没有解锁互斥体,必须
if(poc_precitanych == 0){
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
你在 vlakno2 中遇到了同样的问题:
if(pocet_pisanych == 0){
pthread_exit(NULL);
}
必须是
if(pocet_pisanych == 0){
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
下面也很奇怪:
pocet_pisanych = fwrite(a, sizeof(char),poc_precitanych, stdout);
if(pocet_pisanych == 0){
pthread_exit(NULL);
}
即使不是不可能,也很难在stdou上写不成功。所以你走出那个循环的唯一机会是 poc_precitanych
估值 0
补充说明,你 #define V 300
但你在别处使用 V 时却 char a[300];
。最好做 char a[V];
或在别处使用 sizeof(a)
而不定义 V
修改后的执行示例:
/tmp % ./a.out < /dev/null
main
vlakno 1vlakno 2
没有什么可读的所以 poc_precitanych
值 0 并且两个线程完成,但是
/tmp % echo "1 2 3" | ./a.out
main
vlakno 1vlakno 1vlakno 21 2 3
^C
我正在尝试 运行 一个程序,其中一个线程从标准输入获取数据,然后另一个线程在标准输出上提供数据,没有什么太复杂,但是当我 运行 我的程序使用 /.filename < test.in > test.out 它什么都不做。当我使用 gcc -pthread filename.c -o filename -W -Wall 编译它时,似乎没有错误或警告。有人可以解释吗?同样在文件 test.out 中没有显示任何内容,在 test.in 中是一个简单的句子。 这是节目
#define V 300
pthread_cond_t cond;
pthread_mutex_t mutex;
char a[300];
int p = 0;
int w = 0;
void *thread1() {
while(1){
pthread_mutex_lock(&mutex);
printf("thread1");
while(p >0){
pthread_cond_wait(&cond, &mutex);
}
p = fread(a, sizeof(char), V ,stdin);
if(p == 0){
pthread_exit(NULL);
}
if(p <= V){
pthread_cond_signal(&cond);
}
pthread_mutex_unlock(&mutex);
}
}
void *thread2() {
while(1){
pthread_mutex_lock(&mutex);
printf("thread2");
while(w >0){
pthread_cond_wait(&cond, &mutex);
}
w = fwrite(a, sizeof(char),p, stdout);
if(w == 0){
pthread_exit(NULL);
}
if(w <= V ){
pthread_cond_signal(&cond);
}
pthread_mutex_unlock(&mutex);
}
}
int main (void) {
printf("main/n");
fflush(stdout);
pthread_t t1, t2;
pthread_mutex_init(&mutex, NULL);
pthread_cond_init (&cond, NULL);
pthread_create(&t1, NULL, vlakno1, NULL);
pthread_create(&t2, NULL, vlakno2, NULL);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
return 0;
}
由于 printf("main/n");
printf
的输出不会刷新到 stdout
并且创建的线程会永远消耗循环,或者至少会消耗很长时间。
您应该在 printf
语句之后添加 fflush(stdout);
以验证这一点。
然后你可以尝试 printf("main\n");
没有 fflush()
来验证 stdout
是行缓冲的,即:当输出换行符时输出被刷新到终端。
如果您将输出重定向到一个文件,stdout
通常是完全缓冲的,因此您应该在每个输出操作之后添加一个显式的 fflush(stdout);
,这样您就可以在输出文件中看到输出fly 或者杀掉程序后。
请注意,如果您使用英文单词作为标识符、类型、注释和消息,代码将更易于此处的大多数用户阅读。
您的 printf("main/n");
而不是 printf("main\n");
(或只是 puts("main");
)中有明显的拼写错误,但这是一个细节,而不是您的程序永远无法完成的原因
在 vlakno1 中你创建了一个死锁:
if(poc_precitanych == 0){
pthread_exit(NULL);
}
因为你没有解锁互斥体,必须
if(poc_precitanych == 0){
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
你在 vlakno2 中遇到了同样的问题:
if(pocet_pisanych == 0){
pthread_exit(NULL);
}
必须是
if(pocet_pisanych == 0){
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
下面也很奇怪:
pocet_pisanych = fwrite(a, sizeof(char),poc_precitanych, stdout);
if(pocet_pisanych == 0){
pthread_exit(NULL);
}
即使不是不可能,也很难在stdou上写不成功。所以你走出那个循环的唯一机会是 poc_precitanych
估值 0
补充说明,你 #define V 300
但你在别处使用 V 时却 char a[300];
。最好做 char a[V];
或在别处使用 sizeof(a)
而不定义 V
修改后的执行示例:
/tmp % ./a.out < /dev/null
main
vlakno 1vlakno 2
没有什么可读的所以 poc_precitanych
值 0 并且两个线程完成,但是
/tmp % echo "1 2 3" | ./a.out
main
vlakno 1vlakno 1vlakno 21 2 3
^C