Ожидал вывод "Exception opening file" и "Exception get line" каждые 5 секунд.
//
// Created by cucaracha on 02.03.18.
//
#include <iostream>
#include <fstream>
#include <thread>
#include <chrono>
#include <algorithm>
#include <condition_variable>
#include <queue>
struct SFunctorReadLineFromFile
{
void Open(std::string strNameFile)
{
m_ifFile.exceptions(std::ifstream::failbit | std::ifstream::badbit );
try
{
m_ifFile.open(strNameFile);
m_ifFile.is_open();
}
catch(const std::fstream::failure & e)
{
std::cerr << "Exception opening file" << std::endl;
}
}
std::string operator()()
{
try
{
std::getline(m_ifFile, m_strLine);
std::cout<<m_strLine<<"\n";
return m_strLine;
}
catch(const std::fstream::failure & e)
{
std::cout << "Exception get line" << std::endl;
}
}
std::ifstream m_ifFile;
std::string m_strLine;
};
class CExcutor
{
public:
virtual ~ CExcutor() = default;
virtual void Excute(const std::function<void()> & functor) = 0;
};
class CWorkerThread
{
public:
CWorkerThread()
: m_bDone(false)
{
m_Thread = std::thread(&CWorkerThread::Start, this);
}
~CWorkerThread()
{
Shutdown();
}
void Push(const std::function<void()> & rFunctor)
{
{
std::lock_guard<std::mutex> lock(m_Mutex);
m_quFunctors.push(rFunctor);
}
m_CondVar.notify_one();
}
void Shutdown()
{
{
std::lock_guard<std::mutex> lock(m_Mutex);
m_bDone = true;
}
m_CondVar.notify_one();
m_Thread.join();
}
private:
void Start()
{
for(;;)
{
std::function<void()> functor;
{
std::unique_lock<std::mutex> lock(m_Mutex);
m_CondVar.wait(lock, [this]{
return m_bDone || !m_quFunctors.empty();
});
if (m_bDone && m_quFunctors.empty()) {
break;
}
functor = m_quFunctors.front();
m_quFunctors.pop();
}
functor();
}
}
bool m_bDone;
std::condition_variable m_CondVar;
std::mutex m_Mutex;
std::thread m_Thread;
std::queue<std::function<void()>> m_quFunctors;
};
class CParallel : public CExcutor
{
public:
void Excute(const std::function<void()> & functor) override
{
m_cWorkerThread.Push(functor);
}
private:
CWorkerThread m_cWorkerThread;
};
int main(int argc, char * argv[])
{
SFunctorReadLineFromFile * functor = new SFunctorReadLineFromFile;
functor->Open("");
auto parallel = std::make_shared<CParallel>();
while(true) {
parallel->Excute([functor]{ (*functor)(); });
std::this_thread::sleep_for(std::chrono::seconds(5));
}
return 0;
}
Вывод:
/home/cucaracha/MyProjects/StackOverflow/cmake-build-debug/StackOverflow
Exception opening file Exception get line
* Error in `/home/cucaracha/MyProjects/StackOverflow/cmake-build-debug/StackOverflow':
double free or corruption (out): 0x00007f5a3aeacd90 *
======= Backtrace: ========= /lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7f5a3b22e7e5]
/lib/x86_64-linux-gnu/libc.so.6(+0x8037a)[0x7f5a3b23737a]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7f5a3b23b53c]
/home/cucaracha/MyProjects/StackOverflow/cmake-build-debug/StackOverflow[0x401b43]
/home/cucaracha/MyProjects/StackOverflow/cmake-build-debug/StackOverflow[0x401df8]
/home/cucaracha/MyProjects/StackOverflow/cmake-build-debug/StackOverflow[0x40310c]
/home/cucaracha/MyProjects/StackOverflow/cmake-build-debug/StackOverflow[0x402ab5]
/home/cucaracha/MyProjects/StackOverflow/cmake-build-debug/StackOverflow[0x406ff1]
/home/cucaracha/MyProjects/StackOverflow/cmake-build-debug/StackOverflow[0x406f85]
/home/cucaracha/MyProjects/StackOverflow/cmake-build-debug/StackOverflow[0x406e58]
/home/cucaracha/MyProjects/StackOverflow/cmake-build-debug/StackOverflow[0x406da8]
/usr/lib/x86_64-linux-gnu/libstdc++.so.6(+0xb8c80)[0x7f5a3ba6cc80]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x76ba)[0x7f5a3b5886ba]
/lib/x86_64-linux-gnu/libc.so.6(clone+0x6d)[0x7f5a3b2be41d]
======= Memory map: ======== 00400000-0040c000 r-xp 00000000 08:07 2764864
/home/cucaracha/MyProjects/StackOverflow/cmake-build-debug/StackOverflow
0060b000-0060c000 r--p 0000b000 08:07 2764864
/home/cucaracha/MyProjects/StackOverflow/cmake-build-debug/StackOverflow
0060c000-0060d000 rw-p 0000c000 08:07 2764864
/home/cucaracha/MyProjects/StackOverflow/cmake-build-debug/StackOverflow
0231f000-02351000 rw-p 00000000 00:00 0
[heap] 7f5a34000000-7f5a34021000 rw-p 00000000 00:00 0
7f5a34021000-7f5a38000000 ---p 00000000 00:00 0
7f5a3a6ad000-7f5a3a6ae000 ---p 00000000 00:00 0
7f5a3a6ae000-7f5a3aeae000 rw-p 00000000 00:00 0
7f5a3aeae000-7f5a3afb6000 r-xp 00000000 08:05 409560
/lib/x86_64-linux-gnu/libm-2.23.so 7f5a3afb6000-7f5a3b1b5000 ---p
00108000 08:05 409560
/lib/x86_64-linux-gnu/libm-2.23.so 7f5a3b1b5000-7f5a3b1b6000 r--p
00107000 08:05 409560
/lib/x86_64-linux-gnu/libm-2.23.so 7f5a3b1b6000-7f5a3b1b7000 rw-p
00108000 08:05 409560
/lib/x86_64-linux-gnu/libm-2.23.so 7f5a3b1b7000-7f5a3b377000 r-xp
00000000 08:05 409564
/lib/x86_64-linux-gnu/libc-2.23.so 7f5a3b377000-7f5a3b577000 ---p
001c0000 08:05 409564
/lib/x86_64-linux-gnu/libc-2.23.so 7f5a3b577000-7f5a3b57b000 r--p
001c0000 08:05 409564
/lib/x86_64-linux-gnu/libc-2.23.so 7f5a3b57b000-7f5a3b57d000 rw-p
001c4000 08:05 409564
/lib/x86_64-linux-gnu/libc-2.23.so 7f5a3b57d000-7f5a3b581000 rw-p
00000000 00:00 0 7f5a3b581000-7f5a3b599000 r-xp 00000000 08:05 409563
/lib/x86_64-linux-gnu/libpthread-2.23.so 7f5a3b599000-7f5a3b798000
---p 00018000 08:05 409563 /lib/x86_64-linux-gnu/libpthread-2.23.so 7f5a3b798000-7f5a3b799000
r--p 00017000 08:05 409563
/lib/x86_64-linux-gnu/libpthread-2.23.so 7f5a3b799000-7f5a3b79a000
rw-p 00018000 08:05 409563
/lib/x86_64-linux-gnu/libpthread-2.23.so 7f5a3b79a000-7f5a3b79e000
rw-p 00000000 00:00 0 7f5a3b79e000-7f5a3b7b4000 r-xp 00000000 08:05
397309 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f5a3b7b4000-7f5a3b9b3000 ---p 00016000 08:05 397309
/lib/x86_64-linux-gnu/libgcc_s.so.1 7f5a3b9b3000-7f5a3b9b4000 rw-p
00015000 08:05 397309
/lib/x86_64-linux-gnu/libgcc_s.so.1 7f5a3b9b4000-7f5a3bb26000 r-xp
00000000 08:05 1306005
/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7f5a3bb26000-7f5a3bd26000 ---p 00172000 08:05 1306005
/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7f5a3bd26000-7f5a3bd30000 r--p 00172000 08:05 1306005
/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7f5a3bd30000-7f5a3bd32000 rw-p 0017c000 08:05 1306005
/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7f5a3bd32000-7f5a3bd36000 rw-p 00000000 00:00 0
7f5a3bd36000-7f5a3bd5c000 r-xp 00000000 08:05 409562
/lib/x86_64-linux-gnu/ld-2.23.so 7f5a3bf39000-7f5a3bf3f000 rw-p
00000000 00:00 0 7f5a3bf5a000-7f5a3bf5b000 rw-p 00000000 00:00 0
7f5a3bf5b000-7f5a3bf5c000 r--p 00025000 08:05 409562
/lib/x86_64-linux-gnu/ld-2.23.so 7f5a3bf5c000-7f5a3bf5d000 rw-p
00026000 08:05 409562
/lib/x86_64-linux-gnu/ld-2.23.so 7f5a3bf5d000-7f5a3bf5e000 rw-p
00000000 00:00 0 7ffd9b5f2000-7ffd9b613000 rw-p 00000000 00:00 0
[stack] 7ffd9b6c5000-7ffd9b6c8000 r--p 00000000 00:00 0
[vvar] 7ffd9b6c8000-7ffd9b6ca000 r-xp 00000000 00:00 0
[vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0
[vsyscall]
Process finished with exit code 134 (interrupted by signal 6: SIGABRT)
В случае, когда происходит исключение, std::string operator()()
возвращает мусор вместо объекта, приводя к неопределенному поведению. При попытке выполнить деструктор этого объекта вызывающий код скорее всего упадает.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
При загрузке простейшего блинка или hello world на Arduino Mega2560, получаю следующие ошибки:
Встретил несколько раз в проектном коде реализации синглтонов подобным образом:
Есть массивы, динамические двумерные, которые формируются в результате математических операцийМне надо несколько массивов объединить в один...