一个线程显示多个线程
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=]
但是,如果某些线程正在显示该行,则其他线程可能会同时读取它。在您的情况下,您只希望一个线程显示该行,因此您可以忽略此规则。
你可以找到实现的例子:
Readers-Writers Problem 使用信号量
POSIX Threads Programming 非常有用的多线程教程
我在使用多线程显示数据时遇到问题,因为输出的顺序不正确,而且有些行是混合的。我的多线程函数看起来像这样,它显示了所有数据。
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=]但是,如果某些线程正在显示该行,则其他线程可能会同时读取它。在您的情况下,您只希望一个线程显示该行,因此您可以忽略此规则。
你可以找到实现的例子:
Readers-Writers Problem 使用信号量
POSIX Threads Programming 非常有用的多线程教程