2016-07-12 94 views
-2

我写了一个简单的C++代码来查找矢量的最小值,在下面找到。它在VC++和g ++上编译,但在后者上运行到分段错误。如果我的代码包含UB或g ++包含错误,我无法分辨。有人可以识别我的代码中的任何错误吗?线程示例,分段错误

segfault出现在thread :: join()处。

一些调试信息

Program received signal SIGSEGV, Segmentation fault. 
0x0000000000000000 in ??() 
(gdb) where 
#0 0x0000000000000000 in ??() 
#1 0x00000000004688f7 in std::thread::join()() 
#2 0x0000000000000000 in ??() 
(gdb) thread 
[Current thread is 1 (Thread 0x7c6880 (LWP 24015))] 

下面是代码

#include <iostream> 
#include <random> 
#include <thread> 
#include <vector> 
#include <algorithm> 
using namespace std; 

void find_min(vector<double>& x, double& min_val, int& min_id) 
{ 
    min_id = distance(x.begin(), min_element(x.begin(), x.end())); 
    min_val = x[min_id]; 
} 

void find_part_min(vector<double>& x, vector<int>& min_ids, vector<double>& min_vals, int id) 
{ 
    int start_id = (x.size()*id)/min_vals.size(); 
    int end_id = (x.size()*(id + 1))/min_vals.size(); 
    for (int i = start_id; i < end_id; ++i) 
    { 
     if (x[i] < min_vals[id]) 
     { 
      min_ids[id] = i; 
      min_vals[id] = x[i]; 
     } 
    } 
} 


int main() 
{ 
    // define variables 
    int Nthreads = 16; 
    vector<double> x(256 * 256); 
    int min_id = 0; 
    double min_val = 0; 

    // fill up vector with random content 
    mt19937 gen(0); 
    uniform_real_distribution<> dis(0, 1); 
    generate(x.begin(), x.end(), bind(dis,gen)); 

    // find min serial 
    find_min(x, min_val, min_id); 
    cout << min_id << "\t" << min_val << endl; 

    // initilaize variables for parallel computing 
    vector<double> min_vals(Nthreads, numeric_limits<double>::infinity()); 
    vector<int> min_ids(Nthreads, -1); 
    vector<thread> myThreads; 

    for (int id = 0; id < Nthreads; ++id) // define each thread 
    { 
     thread myThread(find_part_min, ref(x), ref(min_ids), ref(min_vals), id); 
     myThreads.push_back(move(myThread)); 
    } 
    for (int id = 0; id < Nthreads; ++id) 
     myThreads[id].join(); // part-calculations are finished 

    // merging the results together 
    min_val = numeric_limits<double>::infinity(); 
    min_id = -1; 
    for (int i = 0; i < Nthreads; ++i) 
    { 
     if (min_vals[i] < min_val) 
     { 
      min_val = min_vals[i]; 
      min_id = min_ids[i]; 
     } 
    } 

    cout << min_id << "\t" << min_val << endl; 

    return 0; 
} 
+1

诊断段错误时,获取回溯并知道段错误发生的位置很有用。 – md5i

+0

通过valgrind/helgrind运行它并没有在linux/g ++上显示任何问题 - 5.3 – Arunmu

+0

从[未编译的代码]声明运行时错误(http://coliru.stacked-crooked.com/a/19c20c61347e8a2f)听起来怪怪的。 –

回答

1

对于GCC(g ++)的每个编译阶段,您应该使用-pthread作为选项,而不是链接到-lpthread

比实际使用该标志的简单链接涉及更多的东西。

+0

感谢您的信息。我也尝试了-thread而不是-lpthread,而且它本身并没有解决问题。 – DanielTuzes

+0

我从来没有说过,它实际上解决了你的问题,超出了我发布的样本。 –