I'm trying to parallelize a method inside a Parser class. Since this method requires shared mutex I wasn't able to use OpenMP, and therefore had to go with the standard libraries.
I'm currently working with C 17, and here's the main code that's not working:
auto p = Parser(.7);
int tMax = thread::hardware_concurrency();
vector<thread> threads;
int chunk = (int)lines.size() / tMax;
for (int i = 0; i < tMax; i) {
int start = chunk * i;
threads.emplace_back(&Parser::parse, &p,lines, start, i);
}
The problem is that I get a SIGABRT at the creation of a new thread and I can't figure out the reason for this.
You can find the full/messy code here. In case you want to dive into it I'll leave a brief list of the important lines:
- 32-110: Auxiliary objects definitions
- 112: Start of Parser definition
- 335: parse method definition
- 424: main (referenced code at 443)
I looked for similar cases to mine (like this one) but I still can't understand what is really happening and why.
Debugging only leads me to the thread constructor and into assembly code, until it reaches the terminate exception thrower.
I think I might be messing something up with address and references, since I'm passing the object itself, but I don't have enough experience with C to know for certain.
I should also mention that this function works perfectly when called within the main thread, but when creating the second thread it seems to throw SIGABRT.
EDIT:
Minimal/Cleaned Example can be found here.
CodePudding user response:
You're creating a vector
of threads and then immediately exit main
without waiting for any of them to finish execution. This will cause them to crash.
Adding for(auto& t : threads) t.join();
to the end of main to wait on all the threads works in my test.