一个线程显示多个线程

One thread that displays multiple threads

我在使用多线程显示数据时遇到问题,因为输出的顺序不正确,而且有些行是混合的。我的多线程函数看起来像这样,它显示了所有数据。

    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);
    }

现在我想创建一个缓冲区,线程将向其写入输出,然后创建一个线程来显示所有数据。我不知道该怎么做。谁能帮我? 编辑 我不想使用互斥。

编辑 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);

这是正确的方法吗? 函数 find 打印所有数据。

您应该确保每一行都是原子写入的。可以使用互斥量并使每个单独的线程临时锁定缓冲区。这可能是糟糕的设计。让每个线程确保一次写入整行可能更好,因此为此使用每个线程缓冲区。这可能会阻止您需要互斥锁,因为这会带来复杂性和错误。

另一种设计是每个线程都有一个缓冲区和互斥量,并让您的输出线程定期遍历所有线程,锁定该线程的互斥量,提取缓冲区的内容,解锁互斥量,输出缓冲区。这是一种允许不同优先级的设计。

这些行的顺序错误...好吧,这对你来说是多线程的。如果这是一个问题,那么你可能搞砸了你的设计。

the output is not in the correct order, and some lines are mixed

因为,你的程序是同时接受读和写的。例如,当一个线程试图读取(显示)该行的上下文时,至少有一个线程正在编辑该行,因此当 reader 尚未完成读取时,它会更改该行的上下文。

你必须同步读写。

  • 如果其中一个线程尝试编辑该行,则不应同时显示其他线程,否则 him/her.

    [ 将看不到更改=37=]
  • 但是,如果某些线程正在显示该行,则其他线程可能会同时读取它。在您的情况下,您只希望一个线程显示该行,因此您可以忽略此规则。

    你可以找到实现的例子:

    1. Reader-Writer problem using Monitors 使用互斥和信号

    2. Readers-Writers Problem 使用信号量

    3. POSIX Threads Programming 非常有用的多线程教程