2014-01-08 5 views
2

, почему эта программа дает ошибку seg. Я попытался выяснить проблему с помощью gdb, но не повезло.Почему эта небольшая многопоточная программа C++ 11, дающая ошибку сегментации

#include <iostream> 
#include <condition_variable> 
#include <thread> 
#include <chrono> 

using namespace std; 

condition_variable cv; 
mutex cv_m; 

mutex m; 

int count = 0; 
#define COUNT_DONE 10 
#define COUNT_HALT1 3 
#define COUNT_HALT2 6 

void functionCount1() 
{ 
    for(;;) 
    { 
     m.lock(); 
     count++; 
     cout << "Counter value functioncount1: " << count << endl; 
     m.unlock(); 

     if(count >= COUNT_DONE) 
       return; 
    } 
} 

void functionCount2() 
{ 
    for(;;) 
    { 
     m.lock(); 
     count++; 
     cout << "Counter value functionCount2: " << count << endl; 
     m.unlock(); 

     if(count >= COUNT_DONE) return; 
    } 
} 

int main() 
{ 
    thread t1(functionCount1), t2(functionCount2); 
    t1.join(); 
    t2.join(); 
    return 0; 
} 
+0

Если отладчик не помогает, то вам нужно добавить протоколирования сообщений, прежде всего знать, где выдаёт ошибку сегментации происходит. –

+2

Ваша программа имеет неопределенное поведение: доступ к 'count' вне мьютекса - это гонка данных. [С исправленным UB] (http://coliru.stacked-crooked.com/a/d7aeb98c985d5d27 «Живой код в Coliru»), кажется, все в порядке. – Casey

+0

Пожалуйста, используйте классы блокировки для блокировки мьютексов, а не исключающих небезопасные функции-члены. См. Эту статью для справки: http://www.stroustrup.com/C++11FAQ.html#std-lock – Andrzej

ответ

2

Ваша программа имеет неопределенное поведение: доступы к count вне мьютекса в functionCount1 и functionCount2 являются гонки данных. With the UB corrected, it seems fine:

#include <iostream> 
#include <mutex> 
#include <thread> 

using namespace std; 

mutex m; 
int count = 0; 
#define COUNT_DONE 10 

void functionCount(const char* name) 
{ 
    for(;;) 
    { 
     m.lock(); 
     auto c = ++count; 
     m.unlock(); 

     cout << "Counter value " << name << ": " << c << endl; 
     if(c >= COUNT_DONE) 
       return; 
    } 
} 

int main() 
{ 
    thread t1(functionCount, "functionCount1"), t2(functionCount, "functionCount2"); 
    t1.join(); 
    t2.join(); 
} 

или если вы хотите быть «умным» и запутать код рецензентов:

void functionCount(const char* name) 
{ 
    for(;;) 
    { 
     auto c = (std::lock_guard<std::mutex>(m), count++); 
     cout << "Counter value " << name << ": " << c << endl; 
     if(c >= count_done) 
      break; 
    } 
} 
Смежные вопросы