一条线程可以显示多条线程

问题描述 投票:0回答:1

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

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

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

EDIT 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将所有数据prits。

c multithreading pthreads buffer
1个回答
2
投票

输出的顺序不正确,有些行是混在一起的。

因为,你的程序是同时接受读和写的。比如,当一个线程试图读取(显示)行的上下文时,至少有一个线程在编辑这行,所以,当读取者还没有完成读取时,就会使行的上下文发生变化。

你必须同步读和写。

  • 如果其中一个线程尝试编辑这一行,其他线程不应该同时显示,否则他将看不到变化。

  • 但是,如果有一些线程在显示该行,那么其他线程可能会同时读取该行。在你的情况下,你希望只有一个线程显示该行,所以你可以忽略这个规则。

    你可以找到实现的例子。

    1. 使用Monitors的Reader-Writer问题 使用缄默剂和信号

    2. 读者-作家问题 使用信号体

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


0
投票

你应该确保每一行都是原子式写入的。可以使用mutex,让每个单独的线程暂时锁定缓冲区。这可能是不好的设计。让每个线程确保一次写一整行可能会更好,所以要使用每个线程的缓冲区。这可能会避免你需要一个mutex,因为这会引入复杂性和bug。

另一种设计是每个线程有一个缓冲区和mutex,让你的输出线程定期迭代所有线程,锁定该线程的mutex,提取缓冲区的内容,解锁mutex,输出缓冲区。这是一种允许不同优先级的设计。

这一行的顺序不对... ... 这就是你的多线程了。如果这是一个问题,那么你可能已经搞砸了你的设计。

© www.soinside.com 2019 - 2024. All rights reserved.