我有以下代码
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 :(得分: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;
}
答案 1 :(得分: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);
}
您可能会在后续运行中获得不同的结果,但我怀疑您是否会满足您的期望。信号不会排队。