C 一个线程显示多个线程
我在显示多线程的数据时遇到问题,因为输出顺序不正确,并且有些行是混合的。我的多线程函数如下所示,它显示所有数据C 一个线程显示多个线程,c,multithreading,pthreads,buffer,C,Multithreading,Pthreads,Buffer,我在显示多线程的数据时遇到问题,因为输出顺序不正确,并且有些行是混合的。我的多线程函数如下所示,它显示所有数据 for (int i = 0; i < 3; i++) { pthread_create(&tid_array[i], NULL, find, &wData[i]); } for (int i = 0; i < 3; i++) { pthread_join(tid_array[i],
for (int i = 0; i < 3; i++)
{
pthread_create(&tid_array[i], NULL, find, &wData[i]);
}
for (int i = 0; i < 3; i++)
{
pthread_join(tid_array[i], NULL);
}
for(int i=0;i<3;i++)
{
pthread_create(&tid_数组[i],NULL,find,&wData[i]);
}
对于(int i=0;i<3;i++)
{
pthread_join(tid_数组[i],NULL);
}
现在我想创建一个缓冲区,线程将向其中写入输出,然后创建一个显示所有数据的线程。我不知道怎么做。有人能帮我吗?
编辑
我不想使用互斥
编辑2
int rc;
for (int i = 0; i < 3; i++)
{
rc = pthread_create(&tid_array[i], NULL, find, &wData[i]);
}
for (int i = 0; i < 3; i++)
{
rc = pthread_join(tid_array[i], NULL);
}
pthread_t tid;
pthread_create(&tid, NULL, (void *)rc, NULL);
pthread_join(tid, NULL);
int-rc;
对于(int i=0;i<3;i++)
{
rc=pthread_create(&tid_数组[i],NULL,find,&wData[i]);
}
对于(int i=0;i<3;i++)
{
rc=pthread_join(tid_数组[i],NULL);
}
pthread_t tid;
pthread_创建(&tid,NULL,(void*)rc,NULL);
pthread_join(tid,NULL);
这条路对吗?
函数find prits所有数据。您应该确保每一行都是以原子方式写入的。可以使用互斥锁并使每个线程临时锁定缓冲区。这可能是个糟糕的设计。最好让每个线程确保一次写入一整行,因此为此使用每个线程缓冲区。这可能会使您不需要互斥,因为这会带来复杂性和bug
for (int i = 0; i < 3; i++)
{
pthread_create(&tid_array[i], NULL, find, &wData[i]);
}
for (int i = 0; i < 3; i++)
{
pthread_join(tid_array[i], NULL);
}
另一种设计是每个线程有一个缓冲区和互斥体,让输出线程定期迭代所有线程,锁定该线程的互斥体,提取缓冲区的内容,解锁互斥体,输出缓冲区。这是一种允许不同优先级的设计
行的顺序不对。。。这对你来说就是多线程。如果这是一个问题,那么你可能把你的设计搞砸了。你应该确保每一行都是以原子方式写的。可以使用互斥锁并使每个线程临时锁定缓冲区。这可能是个糟糕的设计。最好让每个线程确保一次写入一整行,因此为此使用每个线程缓冲区。这可能会使您不需要互斥,因为这会带来复杂性和bug 另一种设计是每个线程有一个缓冲区和互斥体,让输出线程定期迭代所有线程,锁定该线程的互斥体,提取缓冲区的内容,解锁互斥体,输出缓冲区。这是一种允许不同优先级的设计 行的顺序不对。。。这对你来说就是多线程。如果这是一个问题,那么你可能把你的设计搞砸了 输出顺序不正确,有些行混合 因为,你的程序同时接受阅读和写作。例如,当一个线程尝试读取(显示)该行的上下文时,至少有一个线程编辑该行,因此当读取器尚未完成读取时,该线程会更改该行的上下文 你必须同步读写
- 如果其中一个线程尝试编辑该行,则不应同时显示其他线程,否则他/她将看不到更改
- 但是,如果某些线程正在显示该行,则其他线程可能会同时读取该行。在您的情况下,您只希望一个线程显示该行,因此可以忽略此规则 您可以找到实施的示例:
- 使用互斥和信号
- 使用信号量
- 非常有用的多线程教程
- 如果其中一个线程尝试编辑该行,则不应同时显示其他线程,否则他/她将看不到更改
- 但是,如果某些线程正在显示该行,则其他线程可能会同时读取该行。在您的情况下,您只希望一个线程显示该行,因此可以忽略此规则 您可以找到实施的示例:
- 使用互斥和信号
- 使用信号量
- 非常有用的多线程教程
但一次只能有一个线程工作。
。您可以创建多个线程来同时编辑缓冲区,但差异线程编辑缓冲区的不同部分。例如,您拥有缓冲区abc def
,线程1编辑abc
部分,线程2编辑def
部分。缓冲区是否应该是这样的buff[i]=pthread_create(&tid_数组[i],NULL,searchForWord1,&wData[i])代码>我不想使用互斥或信号量,因为我想要多线程。但一次只能有一个线程工作。您知道如何使用缓冲区实现它吗?互斥量和信号量是为多线程中的同步而创建的。但一次只能有一个线程工作。
。您可以创建多个线程来同时编辑缓冲区,但差异线程编辑缓冲区的不同部分。例如,如果缓冲区看起来有问题,您可以使用缓冲区abc def
,线程1编辑abc
部分,线程2编辑def
部分