在20行程序中创建C线程.为什么不起作用?

wsn*_*ski 9 c++ multithreading

我正在尝试运行一个简短的程序,在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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

有关为什么会出现这种情况的任何建议?

编辑:

我已经得到了在循环后添加连接的响应

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;
}
Run Code Online (Sandbox Code Playgroud)

但它仍然不起作用,加入做错了吗?

固定

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

cni*_*tar 8

您需要加入或主线程将退出:

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

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

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

请记住,使用多线程时,如果一个电话exit,他们都死了.

编辑

将endl添加到"inside"的末尾确实可以使它更好地工作,但它似乎是一个解决方案.只是想知道为什么即使连接存在也是必要的.

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

  • @wsnarski尝试在cout中添加`endl`或手动刷新输出(`cout.flush`). (2认同)