D - std.threads : smp programming
- Wiz (56/56) Jul 30 2007 std.threads is a great lib, helped me more than one time.
std.threads is a great lib, helped me more than one time. But there was a missing thing, something to really help programmers making smp code. We need to create a thread by core/cpu, but, there is nothing like a function that return the number of processors. So I googled that, and found in c the get_nprocs function, returning the number of available cpus. It's used by including sys/sysinfo.h Here is a D code that exploits it : import std.stdio; import std.thread; import std.c.time; import std.math; extern (C) { //sys/sysinfo.h info libc --index-search=_SC_NPROCESSORS_CONF extern int get_nprocs(); } class Nb1Calc { int increment; int number; this(int n, int i) { increment=i; number=n; Thread t=new Thread(&calc); t.start(); } bool isnb1(int a) { int m=cast(int)sqrt(cast(float)a); for (int i=2; i<=m; i++) if (a%i == 0) return false; return true; } int calc() { writefln("[Thread 0x", cast(void*)Thread.getThis(), "] Starting thread (", number, " + x * ", increment, ")"); for (int i=number; ; i+=increment) if (isnb1(i)==true) writefln("[Thread 0x", cast(void*)Thread.getThis(), "] Number ", i, " is a prime number"); return 0; } } int main(char[][] args) { int ncpu=get_nprocs(); writefln("Separating in ", ncpu, " threads."); for (int i=0; i < ncpu; i++) new Nb1Calc((i+1)*2+1, ncpu*2); for (;;) sleep(2); return 0; } Determinating prime numbers using each thread by core. Sorry for using no lock while writefln, it's just an simple example. Is there a way that get_nprocs could be added in the d's std lib ? Something like int Thread.get_nprocs(); would be fine.
Jul 30 2007