std::thread leads to Abort

I'm trying to code a program for dealing with prime numbers. The idea is to have the prime list readable by all threads, but writeable by 1.

Code:

`#include "gmpxx.h"`

#include <iostream>

#include <thread>

#include <vector>

// primes must be initialised with at least the first two prime numbers.

static std::vector<mpz_class> primes = {2, 3};

// integer sqrt

static mpz_class sqrt(mpz_class n)

{

mpf_class x, y = n;

do{

x = y;

y = (x + n / x) / 2;

}while(abs(y - x) >= 1);

return y;

}

// extends primes to the lowest prime greater than or equal to n

static void extend_primes(mpz_class n)

{

// Unfortunately, the primes can't efficiently, if at all, be extended concurrently...

static std::mutex m;

std::lock_guard<std::mutex> lock(m);

for(mpz_class i = primes.back() + 2;i <= n;i += 2)

{

bool prime = true; // Assume i is prime.

for(auto j = primes.begin();prime && *j <= sqrt(i);j++)

if(i % *j == 0)

prime = false;

if(prime)

primes.push_back(i);

}

}

int main()

{

extend_primes(7);

std::thread t(extend_primes, 19); // This (or a resulting call) must be the cause. When commented out, everything works fine.

for(auto i = primes.begin();i < primes.end();i++)

std::cout << i->get_str() << " ";

std::cout << std::endl;

return 0;

}

The error:

Code:

`$ gcc -ggdb -std=c++0x -lstdc++ -lgmp -o prime prime.cpp`

$ ./prime

terminate called after throwing an instance of 'std::system_error'

what():

Aborted