我有以下代码
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)打印读取的单词。该过程重复进行,直到文件被完全读取并打印为止。
正是鸭的建议。
您可以做的是使用一个线程进行阅读和一个用于打印的线程,每个线程彼此发出信号以保持同步:
static void *print(void *ptr)
{
char *message = (char *)ptr;
int sig;
while(!feof(pFile))
{
sigwait(&set, &sig);
printf("%sn", 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;
}
它会导致"时钟",因为您正在将指针传递到数据。单词将在线程中运行的循环之前多次覆盖。"时钟"只是发生在该内存位置的最后一件事。
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);
}
您可能会在随后的运行中获得不同的结果,但我怀疑您会期望的。信号不会排队。