c ++:使用多线程

时间:2015-12-12 00:34:10

标签: c++ multithreading console cursor

我在Mac系统下使用xcode。

我想用c ++在控制台中模拟falling code

我的设计是每个下降的代码链都是一个对象,它有一个包含系统API的函数来移动光标。通过多线程,我可以模拟一些下降的代码链。

这是我的代码:

// CodeChain.h
class CodeChain
{
public:
    CodeChain(int, int);
    void setx(int);
    void sety(int);
    void show();
    std::thread threadShow();
private:
    char codes[256];
    int x, y;
};


//CodeChain.cpp
CodeChain::CodeChain(int ax, int ay) : x(ax), y(ay)
{
    codes[0] = 'a';
    codes[1] = 'b';
    codes[2] = 'c';
    codes[3] = 'd';
    codes[4] = '\0';
}

void CodeChain::show()
{
    int i = 0;
    char ch;
    int n = 0;
    while (true) {
        move(x + n - 1, y);
        printw("%c", ' ');
        i = 0;
        while ((ch = codes[i]) != '\0') {
            move(x + i + n, y);
            printw("%c", ch);
            ++i;
        }
        n++;
        refresh();
        sleep(1);
    }
}

std::thread CodeChain::threadShow()
{
    return std::thread([=] { show(); });
}


void CodeChain::setx(int ax)
{
    x = ax;
}

void CodeChain::sety(int ay)
{
    y = ay;
}


// main.cpp
int main(int argc, char *argv[]) {   
    initscr();
    start_color();

    CodeChain cc0(5, 1);
    CodeChain cc1(5, 2);

    std::thread t0 = cc0.threadShow();
    std::thread t1 = cc1.threadShow();

    t0.join();
    t1.join();


    return 0;
}

如果只有一个CodeChain对象,意味着只运行一个线程,它就可以工作。我可以看到一个下降的代码链。

但是,如果我添加一个线程,就像上面的代码一样,一切都会被搞砸。我到处都可以看到代码。似乎我遇到了同步问题,但我无法理解。

1 个答案:

答案 0 :(得分:0)

move(x + i + n, y)
printw("%c", ch);

必须锁定两条线。否则就会出现同步问题。