Как правильно печатать с помощью g ++ с printf? - PullRequest
1 голос
/ 25 февраля 2011

Я компилирую этот код с помощью g ++:

#include <pthread.h>
#include <iostream>
#include <cstdlib>
#include <string>
#include <stdio.h>

using namespace std;

#define num_threads 3
#define car_limit 4

pthread_mutex_t mutex; // mutex lock
pthread_t cid;         // thread id
pthread_attr_t attr;   // thread attrubutes

void *OneCar(void *dir);
void ArriveBridge(int *direction);
void CrossBridge();
void ExitBridge(int *direction);


int main()
{

    int dir[3] = {0,1,1};
    pthread_mutex_init(&mutex, NULL);
    pthread_attr_init(&attr);

    //cout<< "Pthread Create" << endl;
    printf("Pthread Create\n");

    for(int i = 0; i < num_threads; i++)
    {
        pthread_create(&cid, &attr, OneCar, (void *)&dir[i]);
    }


return 0;
}


void ArriveBridge(int *direction)
{
    //cout<<"Arrive"<<*direction << endl;
    int dr;

    if(*direction == 0)
        dr=0;
    else
        dr=1;

    printf("Arrive%d", dr);
}

void CrossBridge(int *dir)
{   
    char d;

    if(*dir == 0)
        d = 'N';
    else
        d = 'S';

    //cout<<"Crossing Bridge going:"<<d<<endl;
    printf("Crossing Bridge going %c", d);
}

void ExitBridge(int *direction)
{
    //cout<<"Exit" <<*direction<<endl;
    int dr;

    if(*direction == 0)
        dr=0;
    else
        dr=1;

    printf("Exit%d\n", dr);
}

void *OneCar(void *dir)
{
    int *cardir;
    cardir = (int *) dir;

    //cout<<*cardir;

    ArriveBridge(cardir);
    CrossBridge(cardir);
    ExitBridge(cardir);

    return 0;
}

и ожидаю, что этот результат будет выведен на экран:

> Pthread Create
> Arrive0Crossing Bridge going NExit0
> Arrive1Crossing Bridge going SExit1
> Arrive1Crossing Bridge going NExit1

Но вместо этого я получаю:

Pthread Create
Arrive0Crossing Bridge going NExit0

Почему не распечатывается все остальное?

Ответы [ 3 ]

3 голосов
/ 26 февраля 2011

Вам нужно использовать «pthread_join» в main, чтобы дождаться завершения всех потоков, прежде чем ваша программа завершит работу. Вам также следует использовать массив для хранения идентификатора каждого создаваемого вами потока:

pthread_t cid[num_threads];  // thread id`

Затем вы захотите вызывать join для каждого создаваемого вами потока:

for(int i = 0; i < num_threads; i++)
{
    pthread_create(&cid[i], &attr, OneCar, (void *)&dir[i]);
}


for(int i = 0; i < num_threads; ++i)
{
   pthread_join(cid[i], NULL);
};

Запуск модифицированного кода теперь дает:

Pthread Create
Arrive0Crossing Bridge going NExit0
Arrive1Crossing Bridge going SExit1
Arrive1Crossing Bridge going SExit1
3 голосов
/ 25 февраля 2011

Вы пытались присоединиться к своим темам в конце main?Возможно, программа завершается до того, как другие потоки полностью завершатся.

1 голос
/ 25 февраля 2011

Вы пропустили переводы строки ("\ n"):

printf("Arrive%d\n", dr);
printf("Crossing Bridge going %c\n", d);

Из-за этого потоки, вероятно, не очищаются. Кроме того, если вы не ждете своих потоков (pthread_join), ваша программа завершит работу, прежде чем потоки смогут выполнять свою работу.

...