Making restartable snapshots of a process is very hard, because a process can have all kinds of interactions with the filesystem. As a rule, don't expect unix systems to support this. There have been unix variants with restartable core dumps, but I don't think this is the case on modern ones (they've become too complex).
Lisp systems typically have a dump command that creates a restartable image. So you could write your program in a Lisp dialect that supports dumping.
You can run your code in a virtual machine and use the virtual machine manager (e.g. VirtualBox) to create periodic snapshots. Depending on what your program does, this may or may not hurt performance.
The best solution is probably for you to build a snapshot feature into your program. For purely computational programs, this is often only moderatly difficult. In a multithreaded computational program, snapshot points are typically global synchronization points, where all the threads communicate. Try to structure your program as a bag of tasks, and make the entry point a dispatcher which starts a task whenever a processor is free. Upon receipt of a signal, the dispatcher waits for all current tasks to finish, saves the program states, and starts dispatching tasks again.