c++使用信号量的并发问题:按顺序打印

问题描述 投票:0回答:1

作为 C++ 并发练习,我想使用信号量按顺序打印字母 A B C。这是我的代码:

binary_semaphore sem[] = { binary_semaphore(1), binary_semaphore(0), binary_semaphore(0) };
int cnt = 0;

void func(int c) {
    while (true) {
        sem[c].acquire();
        printf("%c ", c + 'A');
        // if (++cnt == 10) {
        //     break;
        // }
        sem[(c + 1) % 3].release();
    }
}

int main() {
    vector<thread> pool;
    for (int i = 0; i < 3; i++) {
        pool.push_back(thread(func, i));
    }
    for (auto& t : pool) {
        t.join();
    }
    return 0;
}

它有效。但奇怪的是,如果我启用这三个注释行

        if (++cnt == 10) {
            break;
        }

有些东西似乎被阻塞了,什么也没有打印出来。

任何人都可以给我一些提示,这些线如何使信号量损坏?谢谢。

c++ concurrency semaphore
1个回答
0
投票

这样

break;
,一个线程就完成了,而另外 2 个线程仍然被获取阻塞。 由于
printf
可能会被缓冲,因此您看不到实际输出。

如果刷新输出,您会看到输出演示

如果移动

break;
:

std::atomic<int> cnt = 0;

void func(int c) {
    while (true) {
        sem[c].acquire();
        printf("%c ", c + 'A');
        fflush(stdout);
        sem[(c + 1) % 3].release();
        if (++cnt >= 10) {
             break;
        }
    }
}

其他线程不再被阻塞演示(尽管增量不再受到保护)。

© www.soinside.com 2019 - 2024. All rights reserved.