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 读取该行的每个单词。然后该词被发送到“打印”方法(通过 pthread_create 的参数)并在发送信号时打印读入的词(通过 pthread_kill)。该过程一直重复,直到文件被完全读入并打印出来。

4

2 回答 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;
}
于 2012-11-01T01:56:03.847 回答
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);
}

您可能会在随后的运行中得到不同的结果,但我怀疑您是否会达到您的期望。信号不会排队。

于 2012-11-01T01:52:05.167 回答