9

我正在尝试运行一个短程序,该程序在 for 循环中创建三个线程,每个线程都将“内部”写入屏幕。Cygwin 在不同机器上同时运行 XP 和 Vista 时会发生这种情况。这是当前的代码。

#include <iostream>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
using namespace std;
void* printInside(void* arg);

int main()
{
    pthread_t threads[3];
    for(int i = 0; i < 3; i++)
    {
        pthread_create(&threads[i], 0, printInside, 0);
    }
    return 0;
}
void* printInside(void* arg)
{
    cout << "inside";
        return 0;
}

它不起作用。如果我在 for 循环内部添加一个 cout,它似乎会减慢它的工作速度。

for(int i = 0; i < 3; i++)
{
    cout << "";
    pthread_create(&threads[i], 0, printInside, 0);
}

关于为什么会这样的任何建议?

编辑:

我收到了在循环后添加连接的回复

int main()
 {
     pthread_t threads[3];
     for(int i = 0; i < 3; i++)
    {
        pthread_create(&threads[i], 0, printInside, 0);
    }
     for(int i = 0; i < 3; i++)
    {
        void* result;
        pthread_join(threads[i],&result);
    }
}
 void* printInside(void* arg)
 {
    cout << "inside";
    return 0;
}

但是还是不行,是join做错了吗?

固定的

“输出通常由标准库缓冲。它在某些情况下会被刷新,但有时你必须手动完成。所以即使线程运行并产生输出,除非你刷新它,否则你不会看到它。”

4

2 回答 2

8

您需要加入,否则主线程将退出:

for(int i = 0; i < 3; i++)
{
    pthread_create(&threads[i], 0, printInside, 0);
}
/* Join here. */

如果我在 for 循环内部添加一个 cout,它似乎会减慢它的工作速度。

做事I/O通常是艰难而缓慢的。这为其他线程提供了足够的 CPU 时间来运行。

请记住,当使用多个线程时,如果一个调用exit它们都死了

编辑

在“内部”的末尾添加一个 endl 确实可以使它更好地工作,但这似乎是一个逃避解决方案。只是想知道为什么即使存在加入也是必要的。

输出通常由标准库缓冲。它在某些情况下会被刷新,但有时您必须手动进行。因此,即使线程运行并产生输出,除非您刷新它,否则您也不会看到它。

于 2012-04-30T21:11:25.340 回答
4
  • 您无需等待即可启动所有线程,并在它们开始执行之前退出主线程(因此整个程序)。

  • 在返回之前调用pthread_join将等待其他线程完成。

  • cout帮助,因为它生成上下文切换和其他线程运行的窗口。

于 2012-04-30T21:12:50.027 回答