如何消除此代码中的全局变量?

时间:2012-01-16 20:10:26

标签: c++ multithreading variables global

以下代码创建了两个线程。一个接受输入,另一个同时打印文本。根据我在这个主题上所读到的,全局变量在传统的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 个答案:

答案 0 :(得分:3)

有一些指针传递给你不使用的线程函数。传递指向变量的指针并通过这些指针访问它们,然后您就可以在函数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;
    }

答案 1 :(得分:2)

input_done中创建output_donemain个局部变量,通过使用第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;
        }
    }
}

答案 2 :(得分:0)

是的,全局变量并不好,但并非总是如此。在我看来,你想要两个线程,一个将读取输入,另一个将写入您的输入,为此您需要一些可由两个线程共享的全局变量,以便输入线程可以在全局变量和输出线程中写入数据可以从全局变量中读取数据。在这里,您需要同步两个线程。