diff --git a/checkin_notes b/checkin_notes index 67b94358fa..da552e5c64 100644 --- a/checkin_notes +++ b/checkin_notes @@ -10796,3 +10796,9 @@ David 31 Dec 2009 graphics_lib.cpp lib/ win_util.cpp + +David 31 Dec 2009 + - example multi-thread app: change to use boinc_init_parallel(). + It's way simpler now. + samples/multi_thread/ + multi_thread.cpp diff --git a/samples/multi_thread/multi_thread.cpp b/samples/multi_thread/multi_thread.cpp index a6ed8b8f8b..a89bd226a6 100644 --- a/samples/multi_thread/multi_thread.cpp +++ b/samples/multi_thread/multi_thread.cpp @@ -20,28 +20,6 @@ // It divides this among N "worker" threads. // N is passed in the command line, and defaults to 1. // -// The main issue is how to suspend/resume the threads. -// The standard BOINC API doesn't work - it assumes that -// the initial thread is the only one. -// On Linux, there's no API to suspend/resume threads. -// All you can do is SIGSTOP/SIGCONT, which affects the whole process. -// So we use the following process/thread structure: -// -// Windows: -// Initial thread: -// - launches worker threads, -// - in polling loop, checks for suspend/resume messages -// from the BOINC client, and handles them itself. -// Unix: -// Initial process -// - forks worker process -// - in polling loop, checks for worker process completion -// - doesn't send status msgs -// Worker process -// Initial thread: -// - forks worker threads, wait for them to finish, exit -// - uses BOINC runtime to send status messages (frac done, CPU time) -// // Doesn't do checkpointing. #include @@ -61,8 +39,8 @@ using std::vector; -#define DEFAULT_NTHREADS 1 -#define TOTAL_UNITS 64 +#define DEFAULT_NTHREADS 4 +#define TOTAL_UNITS 16 int units_per_thread; @@ -110,29 +88,10 @@ struct THREAD { } #endif } - -#ifdef _WIN32 - void suspend(bool if_susp) { - if (if_susp) { - SuspendThread(id); - } else { - ResumeThread(id); - } - } -#endif }; struct THREAD_SET { vector threads; -#ifdef _WIN32 - void suspend(bool if_susp) { - for (unsigned int i=0; iid != THREAD_ID_NULL) t->suspend(if_susp); - } - fprintf(stderr, "%s suspended all\n", boinc_msg_prefix()); - } -#endif bool all_done() { for (unsigned int i=0; iid != THREAD_ID_NULL) return false; @@ -182,44 +141,13 @@ void* worker(void* p) { #endif } -void main_thread(int nthreads) { - int i; -#ifdef _WIN32 - static BOINC_STATUS status; -#endif - THREAD_SET thread_set; - for (i=0; i