尝试从头开始实现Leetcode的FizzBuzz多线程问题。收到"libc++abi.dylib: terminating"错误
Tried to implement Leetcode's FizzBuzz multithreading question from scratch. Getting "libc++abi.dylib: terminating" error
几天前,我开始学习多线程,因为即将到来的实习面试。我学会了它,并试图解决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 == 0
和currentNum % 5 == 0
都是假时会发生什么。所有线程最终都会永远等待。
您应该将此条件添加到某个线程中:
if (currentNum % 3 != 0 && currentNum % 5 != 0)
更改函数打印编号的条件
if (currentNum % 3 != 0 && currentNum % 5 != 0) {
...
}
它有效
相关文章:
- C++,我收到一个无法理解的编译器错误
- 不断收到相同的错误...怎么了?C++
- 我收到以下错误:抛出'std::bad_alloc'实例后终止调用
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 带有 -stdlib=libc++ 的 clang++ 9.0.1 找不到<optional>
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- 尝试链接我的着色器时,我收到错误代码"error c5145 must write to gl_position"
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- 尝试从头开始实现Leetcode的FizzBuzz多线程问题。收到"libc++abi.dylib: terminating"错误
- E/libc++abi:终止于类型为google::protobuf::FatalException的未捕获异常
- libc++abi未定义符号:_ZTVN10__cxxabif120__si-class_type_infoE
- MRB_THROW会导致libc++abi.dylib中的错误
- 字符串C :libc abi.dylib:终止未被发现的类型std :: out_of_range:basic
- MacOS 上的线程:libc++abi.dylib:终止
- "Unable to open file libc++abi.dylib" .程序生成,但在运行时崩溃。使用 xcode 10.1 (10B61)
- c++中的字符串库出错:libc++abi.dylib:终止,类型为std::out_of_range:basic_st
- 我该如何解决它?libc++abi.dylib:以 std::invalid_argument 类型的未捕获异常终止:s
- 如何在 Xcode 中追踪"libc++abi.dylib: Pure virtual function called!"
- 删除 std::线程指针会引发异常"libc++abi.dylib: terminating"