-1

我必须创建一个从命令行获取 n 个参数 arg1、arg2 .... argn 的程序,创建 n 个线程,每个线程都将读取一个文本文件 argi 并以相反的顺序打印偶数行。

问题是我的程序创建了线程,完成了它们,但实际上他什么也没做。他只打印一些随机字符,在每次运行时都不同(我认为是内存中的字符)。

下面是我的代码:

#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAXLINE 100
pthread_t myThread[10];
pthread_mutex_t myMutex;

void * fileprint(void * numei) {
    printf("Thread: %ld ...> %s\n", pthread_self(), (char*)numei);
    FILE *fi;
    char line[MAXLINE], *p;
    pthread_mutex_lock(&myMutex);
    int k=0;
    fi = fopen((char*)numei, "r");
    for ( ; ; ) {
        k++;
        p = fgets(line, MAXLINE, fi);
        if (p == NULL) break;
        line[strlen(line) - 1] = '\0';
        if(k %2 ==0){
            for(int j=strlen(line);j>=0;j++){
                printf("%c", line[j]);
            }
        printf("%c","\n");
        }
    }

    fclose(fi);

    printf("Finished thread: %ld ...> %s\n", pthread_self(), (char*)numei);
    pthread_mutex_unlock(&myMutex); 

}


int main(int argc, char* argv[]) {
    pthread_mutex_init(&myMutex, NULL); 
    printf("I'm the father...\n");  

    int i;
    for (i = 1; argv[i]; i++) {
        pthread_create(&myThread[i], NULL, fileprint, (void*)argv[i]);
        printf("Created thread: %ld ...> %s\n", myThread[i], argv[i]);
    }


    for (i = 1; argv[i]; i++) {
        pthread_join(myThread[i], NULL);    
    }

    printf("I'm still the father...\n");


    pthread_mutex_destroy(&myMutex);

    return 1;
}

那么,任何人都可以告诉我有什么问题吗?我尝试了很多东西来修改,但没有...

4

3 回答 3

4

如果将字符串向后移动,则必须减少循环 ( j--) 内的索引。你也应该从strlen(x)-1.

于 2013-11-12T09:19:56.287 回答
3

此行不正确:

printf("%c","\n");

的操作数%c必须是 a char,而不是char*。它应该是:

printf("%c",'\n');

或者:

printf("%s", "\n");

或者:

printf("\n");

但是,我认为这不会导致分段错误,只会导致打印随机字符。

于 2013-11-12T09:20:13.193 回答
0
for (i = 1; argv[i]; i++) {

您也可以使用“argc”,它是 arg 计数器。

 printf("Thread: %ld ...> %s\n", pthread_self(), (char*)numei);
FILE *fi;
char line[MAXLINE], *p;
pthread_mutex_lock(&myMutex);

在您的 fileprint(...) 中,将 printf(...) 放在互斥锁后面,否则其他线程可能会中断它,您会在输出中得到打印一半的奇怪句子。

制造

于 2013-11-12T09:29:52.067 回答