2014-02-03 2 views
1

Я деформирован вверх p_thread внутри класса Worker:уничтожив вектор ошибки темы сегментации

class Worker { 
public: 
    Worker(int worker_num ,void* (*function)(void*),void * params); 
    virtual ~Worker(); 

private: 
    pthread_t thread; 
    int worker_num; 
}; 

Worker::Worker(int worker_num, void* (*function)(void*), void * params) { 
    pthread_create(&thread, NULL, function, (void *) params); 
    logger.log(DEBUG_LEVEL_DEBUG, "Worker id=%u was created\n", worker_num); 
    this->worker_num = worker_num; 
    return; 
} 

Worker::~Worker() { 
    pthread_cancel(thread); 
    logger.log(DEBUG_LEVEL_DEBUG, "Worker id=%u was canceled\n", worker_num); 
    return; 
} 

, чем я создал вектор рабочих на конструктор другого класса THREAD_POOL:

for (int i = 0; i < worker_num; i++) { 
    this->workers.push_back(new Worker(i, thread_exe, ((void*) this))); 
} 

(функция thread_exe - бесконечный цикл). Когда я пытаюсь уничтожить этих работников на destroctor класса THREAD_POOL так:

ThreadPool::~ThreadPool() { 

    for(int worker_index = 0 ; worker_index < workers.size();worker_index++){ 
     delete workers[worker_index]; 
    } 

I мои программы Аварии:

Worker ID = 0 был отменен * Glibc обнаружен * /. autodirect/fwgwork/yehudas/workspace/dt_utils/code_coverage/Debug/fcollect: двойной свободный или поврежденный (выход): 0x0000000000629590 * ======= Backtrace: =========== /libc.so.6[0x3300476166] /lib64/libc.so.6[0x3300478c93] /.autodirect/fwgwork/yehudas/workspace/dt_utils/code_coverage/Debug/fcollect[0x413ae2] /.autodirect/fwgwork/yehudas/workspace/dt_utils/code_coverage/Debug/fcollect[0x412a04] /.autodirect/fwgwork/yehudas/workspace/dt_utils/code_coverage/Debug/fcollect [0x412b70] /.autodirect/fwgwork/yehudas/workspace/dt_utils/code_coverage/Debug/fcollect[0x40e527] /.autodirect/fwgwork/yehudas/workspace/dt_utils/code_coverage/Debug/fcollect [0x4083fe] /lib64/libc.so.6(__libc_start_main+0xfd)[0x330041ed1d] /.autodirect/fwgwork/yehudas/workspace/dt_utils/code_coverage/Debug/fcollect[0x403a69] ====== = Карта памяти: ======== 00400000-00426000 r-xp 00000000 00:21 19570593
/.autodirect/fwgwork/yehudas/workspace/dt _utils/code_coverage/отладки/fcollect 00625000-00626000 RW-р 00025000 19570593 00:21
/.autodirect/fwgwork/yehudas/workspace/dt_utils/code_coverage/Debug/fcollect 00626000-00648000 RW-р 00000000 00:00 0
[куча] 32ffc00000-32ffc20000 г-хр 00000000 FC: 01 670751
/lib64/ld-2.12.so 32ffe1f000-32ffe20000 г - р 0001f000 Ь: 01 670751
/lib64/ld-2.12.so 32ffe20000- 32ffe21000 RW-р 00020000 FC: 01 670751
/lib64/ld-2.12.so 32ffe21000-32ffe22000 RW-р 00000000 00:00 0 3300000000-3300083000 г-хр 00000000 FC: 01 670759
/lib64/libm-2.12 .so 3300083000-330028 2000 --- р 00083000 FC: 01 670759
/lib64/libm-2.12.so 3300282000-3300283000 г - р 00082000 Ь: 01 670759
/lib64/libm-2.12.so 3300283000-3300284000 RW-р 00083000 Ь : 01 670759
/lib64/libm-2.12.so 3300400000-330058b000 г-хр 00000000 FC: 01 670752
/lib64/libc-2.12.so 330058b000-330078a000 --- р 0018b000 FC: 01 670752
/lib64 /libc-2.12.so 330078a000-330078e000 г - р 0018a000 Ь: 01 670752
/lib64/libc-2.12.so 330078e000-330078f000 RW-р 0018e000 FC: 01 670752
/lib64/libc-2.12.so 330078f000 -3300794000 rw-p 00000000 00:00 0 3300800000-3300802000 r-xp 0000 0000 fc: 01 670755
/lib64/libdl-2.12.so 3300802000-3300a02000 --- p 00002000 fc: 01 670755 /lib64/libdl-2.12.поэтому 3300a02000-3300a03000 r - p 00002000 fc: 01 670755 /lib64/libdl-2.12.so 3300a03000-3300a04000 rw-p 00003000 fc: 01 670755 /lib64/libdl-2.12.so 3300c00000-3300c17000 r-xp 00000000 fc : 01 670753 /lib64/libpthread-2.12.so 3300c17000-3300e17000 --- р 00017000 FC: 01 670753 /lib64/libpthread-2.12.so 3300e17000-3300e18000 г - р 00017000 Ь: 01 670753
/lib64 /libpthread-2.12.so 3300e18000-3300e19000 RW-р 00018000 FC: 01 670753 /lib64/libpthread-2.12.so 3300e19000-3300e1d000 RW-р 00000000 00:00 0 3303c00000-3303c16000 г-хр 00000000 FC: 01 670760
/lib64/libgcc_s-4.4.7-20120601.so.1 3303c16000-3303e15000 --- p 00016000 FC: 01 670760
/lib64/libgcc_s-4.4.7-20120601.so.1 3303e15000-3303e16000 RW-р 00015000 FC: 01 670760
/lib64/libgcc_s-4.4.7-20120601.so.1 3304800000-33048e8000 г-хр 00000000 FC: 01 918134
/usr/lib64/libstdc++.so.6.0.13 33048e8000-3304ae8000 --- р 000e8000 FC: 01 918134 /usr/lib64/libstdc++.so.6.0. 13 3304ae8000-3304aef000 г - р 000e8000 Ь: 01 918134
/usr/lib64/libstdc++.so.6.0.13 3304aef000-3304af1000 RW-р 000ef000 FC: 01 918134 /usr/lib64/libstdc++.so.6.0 .13 3304af1000-3304b06000 rw-p 00000000 00:00 0 7fffe8000000-7fffe802100 0 RW-р 00000000 00:00 0 --- 7fffe8021000-7fffec000000 р 00000000 00:00 0 7ffff0000000-7ffff0021000 RW-р 00000000 00:00 0 7ffff0021000-7ffff4000000 --- р 00000000 00:00 0 7ffff6bdb000- 7ffff6bdc000 --- р 00000000 00:00 0 7ffff6bdc000-7ffff75dc000 RW-р 00000000 00:00 0 7ffff75dc000-7ffff75dd000 --- р 00000000 00:00 0 7ffff75dd000-7ffff7fe3000 RW-р 00000000 00:00 0 7ffff7ffa000- 7ffff7ffe000 RW-р 00000000 00:00 0 7ffff7ffe000-7ffff7fff000 г-хр 00000000 00:00 0
[vdso] 7ffffffe9000-7ffffffff000 RW-р 00000000 00:00 0
[стека] ffffffffff600000-ffffffffff601000 г-хр 00000000 00 : 00 0
[vsyscall]

обязательно посоветуйте пожалуйста ...

+3

Я думаю, вы все равно должны 'pthread_join()' отменен нить. Но почему бы не использовать 'std :: thread' ?? –

+1

Google «правило из трех» и заблокировать назначение и создание копии. – Yakk

+0

Yakk - не понял ваш комментарий – yehudahs

ответ

1

Вы забыли увеличиваем счетчик цикла (++) worker_index

ThreadPool::~ThreadPool() { 

for(int worker_index = 0 ; worker_index < workers.size(); ++worker_index){ 
    delete workers[worker_index]; 
} 
+0

Вы правы - я исправляю это, но все еще получаю эту ошибку – yehudahs

Смежные вопросы