You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
228 lines
8.0 KiB
228 lines
8.0 KiB
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: $RCSfile: vtkMultiThreader.h,v $
|
|
|
|
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
|
|
All rights reserved.
|
|
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
|
|
|
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
PURPOSE. See the above copyright notice for more information.
|
|
|
|
=========================================================================*/
|
|
// .NAME vtkMultiThreader - A class for performing multithreaded execution
|
|
// .SECTION Description
|
|
// vtkMultithreader is a class that provides support for multithreaded
|
|
// execution using sproc() on an SGI, or pthread_create on any platform
|
|
// supporting POSIX threads. This class can be used to execute a single
|
|
// method on multiple threads, or to specify a method per thread.
|
|
|
|
#ifndef __vtkMultiThreader_h
|
|
#define __vtkMultiThreader_h
|
|
|
|
#include "vtkObject.h"
|
|
|
|
#ifdef VTK_USE_SPROC
|
|
#include <sys/types.h> // Needed for unix implementation of sproc
|
|
#include <unistd.h> // Needed for unix implementation of sproc
|
|
#endif
|
|
|
|
#if defined(VTK_USE_PTHREADS) || defined(VTK_HP_PTHREADS)
|
|
#include <pthread.h> // Needed for PTHREAD implementation of mutex
|
|
#include <sys/types.h> // Needed for unix implementation of pthreads
|
|
#include <unistd.h> // Needed for unix implementation of pthreads
|
|
#endif
|
|
|
|
// If VTK_USE_SPROC is defined, then sproc() will be used to create
|
|
// multiple threads on an SGI. If VTK_USE_PTHREADS is defined, then
|
|
// pthread_create() will be used to create multiple threads (on
|
|
// a sun, for example)
|
|
|
|
// Defined in vtkSystemIncludes.h:
|
|
// VTK_MAX_THREADS
|
|
|
|
// If VTK_USE_PTHREADS is defined, then the multithreaded
|
|
// function is of type void *, and returns NULL
|
|
// Otherwise the type is void which is correct for WIN32
|
|
// and SPROC
|
|
//BTX
|
|
#ifdef VTK_USE_SPROC
|
|
typedef int vtkThreadProcessIDType;
|
|
typedef int vtkMultiThreaderIDType;
|
|
#endif
|
|
|
|
// Defined in vtkSystemIncludes.h:
|
|
// VTK_THREAD_RETURN_VALUE
|
|
// VTK_THREAD_RETURN_TYPE
|
|
|
|
#ifdef VTK_USE_PTHREADS
|
|
typedef void *(*vtkThreadFunctionType)(void *);
|
|
typedef pthread_t vtkThreadProcessIDType;
|
|
// #define VTK_THREAD_RETURN_VALUE NULL
|
|
// #define VTK_THREAD_RETURN_TYPE void *
|
|
typedef pthread_t vtkMultiThreaderIDType;
|
|
#endif
|
|
|
|
#ifdef VTK_USE_WIN32_THREADS
|
|
typedef vtkWindowsLPTHREAD_START_ROUTINE vtkThreadFunctionType;
|
|
typedef vtkWindowsHANDLE vtkThreadProcessIDType;
|
|
// #define VTK_THREAD_RETURN_VALUE 0
|
|
// #define VTK_THREAD_RETURN_TYPE DWORD __stdcall
|
|
typedef vtkWindowsDWORD vtkMultiThreaderIDType;
|
|
#endif
|
|
|
|
#if !defined(VTK_USE_PTHREADS) && !defined(VTK_USE_WIN32_THREADS)
|
|
typedef void (*vtkThreadFunctionType)(void *);
|
|
typedef int vtkThreadProcessIDType;
|
|
// #define VTK_THREAD_RETURN_VALUE
|
|
// #define VTK_THREAD_RETURN_TYPE void
|
|
typedef int vtkMultiThreaderIDType;
|
|
#endif
|
|
//ETX
|
|
|
|
class vtkMutexLock;
|
|
|
|
class VTK_COMMON_EXPORT vtkMultiThreader : public vtkObject
|
|
{
|
|
public:
|
|
static vtkMultiThreader *New();
|
|
|
|
vtkTypeRevisionMacro(vtkMultiThreader,vtkObject);
|
|
void PrintSelf(ostream& os, vtkIndent indent);
|
|
|
|
// Description:
|
|
// This is the structure that is passed to the thread that is
|
|
// created from the SingleMethodExecute, MultipleMethodExecute or
|
|
// the SpawnThread method. It is passed in as a void *, and it is
|
|
// up to the method to cast correctly and extract the information.
|
|
// The ThreadID is a number between 0 and NumberOfThreads-1 that indicates
|
|
// the id of this thread. The NumberOfThreads is this->NumberOfThreads for
|
|
// threads created from SingleMethodExecute or MultipleMethodExecute,
|
|
// and it is 1 for threads created from SpawnThread.
|
|
// The UserData is the (void *)arg passed into the SetSingleMethod,
|
|
// SetMultipleMethod, or SpawnThread method.
|
|
|
|
//BTX
|
|
#define ThreadInfoStruct vtkMultiThreader::ThreadInfo
|
|
class ThreadInfo
|
|
{
|
|
public:
|
|
int ThreadID;
|
|
int NumberOfThreads;
|
|
int *ActiveFlag;
|
|
vtkMutexLock *ActiveFlagLock;
|
|
void *UserData;
|
|
};
|
|
//ETX
|
|
|
|
// Description:
|
|
// Get/Set the number of threads to create. It will be clamped to the range
|
|
// 1 - VTK_MAX_THREADS, so the caller of this method should check that the
|
|
// requested number of threads was accepted.
|
|
vtkSetClampMacro( NumberOfThreads, int, 1, VTK_MAX_THREADS );
|
|
virtual int GetNumberOfThreads();
|
|
|
|
// Description:
|
|
// Set/Get the maximum number of threads to use when multithreading.
|
|
// This limits and overrides any other settings for multithreading.
|
|
// A value of zero indicates no limit.
|
|
static void SetGlobalMaximumNumberOfThreads(int val);
|
|
static int GetGlobalMaximumNumberOfThreads();
|
|
|
|
// Description:
|
|
// Set/Get the value which is used to initialize the NumberOfThreads
|
|
// in the constructor. Initially this default is set to the number of
|
|
// processors or VTK_MAX_THREADS (which ever is less).
|
|
static void SetGlobalDefaultNumberOfThreads(int val);
|
|
static int GetGlobalDefaultNumberOfThreads();
|
|
|
|
// These methods are excluded from Tcl wrapping 1) because the
|
|
// wrapper gives up on them and 2) because they really shouldn't be
|
|
// called from a script anyway.
|
|
//BTX
|
|
|
|
// Description:
|
|
// Execute the SingleMethod (as define by SetSingleMethod) using
|
|
// this->NumberOfThreads threads.
|
|
void SingleMethodExecute();
|
|
|
|
// Description:
|
|
// Execute the MultipleMethods (as define by calling SetMultipleMethod
|
|
// for each of the required this->NumberOfThreads methods) using
|
|
// this->NumberOfThreads threads.
|
|
void MultipleMethodExecute();
|
|
|
|
// Description:
|
|
// Set the SingleMethod to f() and the UserData field of the
|
|
// ThreadInfo that is passed to it will be data.
|
|
// This method (and all the methods passed to SetMultipleMethod)
|
|
// must be of type vtkThreadFunctionType and must take a single argument of
|
|
// type void *.
|
|
void SetSingleMethod(vtkThreadFunctionType, void *data );
|
|
|
|
// Description:
|
|
// Set the MultipleMethod at the given index to f() and the UserData
|
|
// field of the ThreadInfo that is passed to it will be data.
|
|
void SetMultipleMethod( int index, vtkThreadFunctionType, void *data );
|
|
|
|
// Description:
|
|
// Create a new thread for the given function. Return a thread id
|
|
// which is a number between 0 and VTK_MAX_THREADS - 1. This id should
|
|
// be used to kill the thread at a later time.
|
|
int SpawnThread( vtkThreadFunctionType, void *data );
|
|
|
|
// Description:
|
|
// Terminate the thread that was created with a SpawnThreadExecute()
|
|
void TerminateThread( int thread_id );
|
|
|
|
// Description:
|
|
// Get the thread identifier of the calling thread.
|
|
static vtkMultiThreaderIDType GetCurrentThreadID();
|
|
|
|
// Description:
|
|
// Check whether two thread identifiers refer to the same thread.
|
|
static int ThreadsEqual(vtkMultiThreaderIDType t1,
|
|
vtkMultiThreaderIDType t2);
|
|
|
|
protected:
|
|
vtkMultiThreader();
|
|
~vtkMultiThreader();
|
|
|
|
// The number of threads to use
|
|
int NumberOfThreads;
|
|
|
|
// An array of thread info containing a thread id
|
|
// (0, 1, 2, .. VTK_MAX_THREADS-1), the thread count, and a pointer
|
|
// to void so that user data can be passed to each thread
|
|
ThreadInfo ThreadInfoArray[VTK_MAX_THREADS];
|
|
|
|
// The methods
|
|
vtkThreadFunctionType SingleMethod;
|
|
vtkThreadFunctionType MultipleMethod[VTK_MAX_THREADS];
|
|
|
|
// Storage of MutexFunctions and ints used to control spawned
|
|
// threads and the spawned thread ids
|
|
int SpawnedThreadActiveFlag[VTK_MAX_THREADS];
|
|
vtkMutexLock *SpawnedThreadActiveFlagLock[VTK_MAX_THREADS];
|
|
vtkThreadProcessIDType SpawnedThreadProcessID[VTK_MAX_THREADS];
|
|
ThreadInfo SpawnedThreadInfoArray[VTK_MAX_THREADS];
|
|
|
|
//ETX
|
|
|
|
// Internal storage of the data
|
|
void *SingleData;
|
|
void *MultipleData[VTK_MAX_THREADS];
|
|
|
|
private:
|
|
vtkMultiThreader(const vtkMultiThreader&); // Not implemented.
|
|
void operator=(const vtkMultiThreader&); // Not implemented.
|
|
};
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|