尝试从头开始实现Leetcode的FizzBuzz多线程问题。收到"libc++abi.dylib: terminating"错误

Tried to implement Leetcode's FizzBuzz multithreading question from scratch. Getting "libc++abi.dylib: terminating" error

本文关键字:libc++abi 收到 dylib 错误 terminating 问题 实现 从头开始 Leetcode 多线程 FizzBuzz      更新时间:2023-10-16

几天前,我开始学习多线程,因为即将到来的实习面试。我学会了它,并试图解决Leetcode的FizzBuzz多线程问题,我可以成功解决。但后来我想起在第一次面试中,我被要求从头开始编码,所以我试图实现这个问题。我在网上搜索了错误,但无法弄清楚。

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
class FizzBuzz
{
private:
int n;
int currentNum;
std::mutex mu;
std::condition_variable cond;
public:
FizzBuzz(int n)
{
this->n = n;
currentNum = 1;
}
void fizz();
void buzz();
void fizzbuzz();
void number();
};
void FizzBuzz::fizz()
{
while(currentNum <= n)
{
std::unique_lock<std::mutex> locker(mu);
if (currentNum%3==0 && currentNum%5!=0)
{
std::cout << "Fizz" <<std::endl;
currentNum++;
locker.unlock();
cond.notify_all();
}
else
{
cond.wait(locker);
}
}
}
void FizzBuzz::buzz()
{
while(currentNum <= n)
{
std::unique_lock<std::mutex> locker(mu);
if (currentNum%3!=0 && currentNum%5==0)
{
std::cout << "Buzz" <<std::endl;
currentNum++;
locker.unlock();
cond.notify_all();
}
else
{
cond.wait(locker);
}
}
}
void FizzBuzz::fizzbuzz()
{
while(currentNum <= n)
{
std::unique_lock<std::mutex> locker(mu);
if (currentNum%3==0 && currentNum%5==0)
{
std::cout << "FizzBuzz" <<std::endl;
currentNum++;
locker.unlock();
cond.notify_all();
}
else
{
cond.wait(locker);
}
}
}
void FizzBuzz::number()
{
while(currentNum <= n)
{
std::unique_lock<std::mutex> locker(mu);
if (currentNum%3==0 && currentNum%5!=0)
{
std::cout << currentNum <<std::endl;
currentNum++;
locker.unlock();
cond.notify_all();
}
else
{
cond.wait(locker);
}
}
}

int main()
{
FizzBuzz fb(15);
std::thread t1 (&FizzBuzz::fizz, &fb);
std::thread t2 (&FizzBuzz::buzz, &fb);
std::thread t3 (&FizzBuzz::fizzbuzz, &fb);
std::thread t4 (&FizzBuzz::number, &fb);
t1.join();
t2.join();
t3.join();
t4.join();
return 0;
}

如果您有其他技巧让我提高自己,请告诉我。我是多线程的新手。尝试尽可能多地学习。

编辑:为所有线程添加了 join(( 语句。现在它陷入了僵局。

在你的FizzBuzz::number()中,第一个if条件应该是:"if (currentNum%3!=0 && currentNum%5!=0)""if (currentNum%3==0 && currentNum%5!=0)"

您没有在任何线程上调用join()。这将导致应用程序在销毁std::thread对象时终止。

t4.join();
t3.join();
t2.join();
t1.join();

main函数的末尾。这将等到线程完成,然后再退出程序。

考虑当currentNum = 1(你的第一个值(:currentNum % 3 == 0currentNum % 5 == 0都是假时会发生什么。所有线程最终都会永远等待。

您应该将此条件添加到某个线程中:

if (currentNum % 3 != 0 && currentNum % 5 != 0)

更改函数打印编号的条件

if (currentNum % 3 != 0 && currentNum % 5 != 0) {
...
}

它有效

相关文章: