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
部分