2012-11-01 43 views
1

打印文本文件,我有以下代码使用并行线程和信号

typedef struct 
{ 
    char word[64]; 
} DataStructure; 

sigset_t set; 
FILE *pFile; 

static void *print(void *ptr) 
{ 
    char *message; 
    message = (char *)ptr; 
    int sig; 

    while(!feof(pFile)) 
    { 
     sigwait(&set, &sig); 
     printf("%s \n", message); 
     sleep(2); 
    } 
    return 0; 
} 

int main(int argc, char *argv[]) 
{ 
    DataStructure Data; 

    sigemptyset(&set); 
    sigaddset(&set, SIGUSR1); 
    pthread_sigmask(SIG_BLOCK, &set, NULL); 

    pthread_t thread; 
    pthread_create(&thread, NULL, print, (void *)Data.word); 

    pFile = fopen("rhyme1.txt", "r"); 

    while(!feof(pFile)) 
    { 
     fscanf(pFile, "%s", Data.word); 
     pthread_kill(thread, SIGUSR1); 
    } 

    pthread_join(thread, NULL); 
    pthread_exit(NULL); 
} 

/*The output should look like: 
Hickory, 
dickory, 
dock, 
The 
mouse 
ran 
up 
the 
clock. 

This code results in: 
clock. */ 

我试图打开一个文本文件,并在使用scanf函数的行,每字读。然后这个单词被发送到'print'方法(通过pthread_create的参数)并打印读取的单词(当通过pthread_kill发送信号时)。重复该过程直到文件被完全读入并打印。

回答

0

它导致“时钟”,因为您正在传递一个指向Data.word的指针,该指针在线程中的循环运行之前将被重写多次。 “时钟”恰好发生在该内存位置的最后一件事情上。

while(!feof(pFile)) 
{ 
    fscanf(pFile, "%s", Data.word); 
    pthread_kill(thread, SIGUSR1); 
} 

上面会快速翻阅文件,可能在线程执行之前,当然在2秒睡眠结束之前。

while(!feof(pFile)) 
{ 
    sigwait(&set, &sig); 
    printf("%s \n", message); 
    sleep(2); 
} 

你可能会在后续运行中获得不同的结果,但我怀疑你将永远不会满足你的期望。信号不会排队。

2

究竟是什么鸭建议。

你可以做的是使用一个线程进行读取和一个用于印刷,其中每个信号海誓山盟,以保持同步:

static void *print(void *ptr) 
{ 
    char *message = (char *)ptr; 
    int sig; 

    while(!feof(pFile)) 
    { 
     sigwait(&set, &sig); 
     printf("%s\n", message); 
     pthread_kill(thread2, SIGUSR1); 
    } 


    return 0; 
} 
static void *readstr(void *ptr) 
{ 
    char *message = (char *)ptr; 
    int sig; 

    while(!feof(pFile)) 
    { 
     fscanf(pFile, "%s", message); 
     pthread_kill(thread1, SIGUSR1); 
     sigwait(&set, &sig); 
    } 

    return 0; 
} 
+0

BRILLIANT!我明白现在它是如何工作的!你以这种有用的格式简化了它。不够感谢你:D – Sean