Как я могу устранить глобальные переменные в этом коде? - PullRequest
0 голосов
/ 17 января 2012

Код ниже создает два потока. Один, чтобы принять ввод и другой, чтобы распечатать текст одновременно. Из того, что я прочитал в этой теме, глобальные переменные считаются плохой формой в традиционном коде c ++. Тем не менее, я не могу придумать, как сделать ввод / вывод одновременно без них.

Как я могу исключить эти две логические глобальные переменные из моего кода?

bool input_done = 1;
bool output_done = 1;

void* input(void* ptr)
{
    char msg[256];
    cin.getline(msg,256);
    cout << msg << endl;
    input_done = 1;
    pthread_exit(NULL);
}
void* output(void* ptr)
{
    cout << "Hello World" << endl;
    for(long int x=0;x<1000000000;x++) {}
    output_done = 1;
    pthread_exit(NULL);
}

int main()
{
    while(1)
    {

        pthread_t t1,t2;
        if (input_done)
        {
            pthread_create(&t1,NULL,input,NULL);
            input_done = 0;
        }
        if (output_done)
        {
            pthread_create(&t2,NULL,output,NULL);
            output_done = 0;
        }
    }

}

Ответы [ 3 ]

3 голосов
/ 17 января 2012

В функции потоков передаются указатели, которые вы не используете.Передавайте указатели на ваши переменные и обращайтесь к ним через эти указатели, тогда вы сможете размещать переменные в стеке в функции main или где-либо еще.

Так, например, ваша функция output будет выглядеть следующим образом

void* output(void* output_done)
{
    cout << "Hello World" << endl;
    for(long int x=0;x<1000000000;x++) {}
    *((bool*)output_done) = 1;
    pthread_exit(NULL);
}

и pthread_create вызов:

int main()
{
    bool output_done = 1;

    // ...

    if (output_done)
    {
        pthread_create(&t2,NULL,output, &output_done);
        output_done = 0;
    }
2 голосов
/ 17 января 2012

Создайте input_done и output_done локальные переменные в main, передайте им указатели на функции потока, используя четвертый параметр pthread_create, и разрешите функциям потока изменять их с помощью получаемых указателей.

Пример (с учетом стиля):

void* input(void* ptr)
{
    char msg[256];
    cin.getline(msg, 256);

    cout << msg << endl;

    *(bool*)ptr = true;
    pthread_exit(NULL);
}
void* output(void* ptr)
{
    cout << "Hello World" << endl;

    for(long int x = 0; x < 1000000000; ++x) { }

    *(bool*)ptr = true;
    pthread_exit(NULL);
}

int main()
{
    bool input_done = true;
    bool output_done = true;

    while (true)
    {
        pthread_t t1, t2;

        if (input_done)
        {
            pthread_create(&t1, NULL, input, (void*)&input_done);
            input_done = false;
        }

        if (output_done)
        {
            pthread_create(&t2, NULL, output, (void*)&output_done);
            output_done = false;
        }
    }
}
0 голосов
/ 17 января 2012

Да, глобальные переменные не хороши, но не всегда. Мне кажется, что вам нужны два потока, один из которых будет читать входные данные, а другой - записывать ваши входные данные, для этого вам понадобится некоторая глобальная переменная, которая может быть общей для обоих потоков, чтобы входной поток мог записывать данные в глобальную переменную и выходной поток. может читать данные из глобальной переменной. Здесь вам нужно синхронизировать оба потока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...