Ich schrieb einen einfachen C++ - Code, um den minimalen Wert eines Vektors zu finden, finden Sie weiter unten. Er kompiliert sowohl in VC++ als auch in g ++, läuft aber auf einem Segmentierungsfehler auf dem letzteren. Ich kann nicht unterscheiden, ob mein Code ein UB enthält oder das g ++ einen Fehler enthält. Kann jemand einen Fehler in meinem Code erkennen?Thread Beispiel, Segmentierung Fehler
Der segfault entsteht bei thread :: join().
einige Debug-Informationen
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))]
Hier ist der Code
#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;
}
Bei der Diagnose eines Segmentfehlers ist es nützlich, ein Backtrace zu erhalten und zu wissen, wo der Segmentfehler auftritt. – md5i
Das Ausführen durch Valgrind/Helgrind zeigte keine Probleme unter Linux/g ++ - 5.3 – Arunmu
Anspruch auf Laufzeitfehler von [Code, der nicht kompiliert] (http://coliru.stacked-crooked.com/a/19c20c61347e8a2f) klingt komisch. –