source: issm/trunk-jpl/src/c/shared/Threads/LaunchThread.cpp@ 12495

Last change on this file since 12495 was 12495, checked in by Mathieu Morlighem, 13 years ago

minor

File size: 1.8 KB
RevLine 
[2417]1/*!\file: LaunchThread.cpp
2 * \brief launch thread in a generic way, covering single and multi-threaded cases
3 * This routine attempts to simplify management of multi-threading. When multi-threadeing
4 * is not requested (serial run), LaunchThread will just call the function (provided in argument
5 * list), nothing fancy there. If multi-threading is requested, LaunchThread will launch the
6 * function on multiple threads (num_threads of them), and provide these functions with the
7 * local data they need (folded in the "gate" structure) + the thread id + the number of threads
8 * All this info is collected in the pthread_handle structure.
9 */
10
11#ifdef HAVE_CONFIG_H
[9320]12 #include <config.h>
[2417]13#else
14#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
15#endif
16
17#ifdef _MULTITHREADING_
18#include <pthread.h>
19#endif
20
21#include "./issm_threads.h"
[12435]22#include "../Alloc/xNewDelete.h"
[2417]23#include "../Exceptions/exceptions.h"
[3775]24#include "../../include/include.h"
[2417]25
26void LaunchThread(void* function(void*), void* gate,int num_threads){
27
28 #ifdef _MULTITHREADING_
29 int i;
[12435]30 int *status = NULL;
31 pthread_t *threads = NULL;
32 pthread_handle *handles = NULL;
[2417]33
34 /*dynamically allocate: */
[12435]35 threads=xNew<pthread_t>(num_threads);
36 handles=xNew<pthread_handle>(num_threads);
[2417]37
38 for(i=0;i<num_threads;i++){
39 handles[i].gate=gate;
40 handles[i].id=i;
41 handles[i].num=num_threads;
42 }
43 for(i=0;i<num_threads;i++){
44
45 if(pthread_create(threads+i,NULL,function,(void*)(handles+i))){
[12495]46 _error2_("pthread_create error");
[2417]47 }
48 }
49 for(i=0;i<num_threads;i++){
50 if(pthread_join(threads[i],(void**)&status)){
[12495]51 _error2_("pthread_join error");
[2417]52 }
53 }
54
55 /*Free ressources:*/
[12435]56 xDelete<pthread_t>(threads);
57 xDelete<pthread_handle>(handles);
[2417]58
59 #else
[2418]60 pthread_handle handle;
61 handle.gate=gate;
62 handle.id=0;
63 handle.num=1;
64
65 function((void*)&handle);
[2417]66 #endif
67}
Note: See TracBrowser for help on using the repository browser.