/usr/include/simbody/SimTKcommon/internal/ParallelWorkQueue.h is in libsimbody-dev 3.5.4+dfsg-1ubuntu2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | #ifndef SimTK_SimTKCOMMON_PARALLEL_WORK_QUEUE_H_
#define SimTK_SimTKCOMMON_PARALLEL_WORK_QUEUE_H_
/* -------------------------------------------------------------------------- *
* Simbody(tm): SimTKcommon *
* -------------------------------------------------------------------------- *
* This is part of the SimTK biosimulation toolkit originating from *
* Simbios, the NIH National Center for Physics-Based Simulation of *
* Biological Structures at Stanford, funded under the NIH Roadmap for *
* Medical Research, grant U54 GM072970. See https://simtk.org/home/simbody. *
* *
* Portions copyright (c) 2010-12 Stanford University and the Authors. *
* Authors: Peter Eastman *
* Contributors: *
* *
* Licensed under the Apache License, Version 2.0 (the "License"); you may *
* not use this file except in compliance with the License. You may obtain a *
* copy of the License at http://www.apache.org/licenses/LICENSE-2.0. *
* *
* Unless required by applicable law or agreed to in writing, software *
* distributed under the License is distributed on an "AS IS" BASIS, *
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
* See the License for the specific language governing permissions and *
* limitations under the License. *
* -------------------------------------------------------------------------- */
#include "ParallelExecutor.h"
#include "PrivateImplementation.h"
namespace SimTK {
class ParallelWorkQueue;
class ParallelWorkQueueImpl;
// We only want the template instantiation to occur once. This symbol is defined in the SimTK core
// compilation unit that defines the ParallelWorkQueue class but should not be defined any other time.
#ifndef SimTK_SIMTKCOMMON_DEFINING_PARALLEL_WORK_QUEUE
extern template class PIMPLHandle<ParallelWorkQueue, ParallelWorkQueueImpl>;
#endif
/**
* This class is used for performing multithreaded computations.\ It maintains a queue of tasks to be
* executed, and a pool of threads for executing them. To use it, define one or more subclasses of
* ParallelWorkQueue::Task that performs computations. Then create a ParallelWorkQueue and add Tasks
* to it:
*
* <pre>
* ParallelWorkQueue queue(20);
* queue.addTask(new MyTask());
* </pre>
*
* Each Task's execute() method will be called, and then the Task will be deleted. The invocations are
* done in parallel on multiple threads, so you cannot make any assumptions about what order they will occur in
* or which ones will happen at the same time.
*
* The threads are created in the ParallelWorkQueue's constructor and remain active until it is deleted.
* This means that creating a ParallelWorkQueue is a somewhat expensive operation, but it may then be
* used repeatedly for executing various calculations. By default, the number of threads is chosen
* to be equal to the number of available processor cores. You can optionally specify a different number
* of threads to create. For example, using more threads than processors can sometimes lead to better
* processor utilitization. Alternatively, if only four Tasks will be executed, you might specify
* min(4, ParallelExecutor::getNumProcessors()) to avoid creating extra threads that will never
* have any work to do.
*/
class SimTK_SimTKCOMMON_EXPORT ParallelWorkQueue : public PIMPLHandle<ParallelWorkQueue, ParallelWorkQueueImpl> {
public:
class Task;
/**
* Construct a ParallelWorkQueue.
*
* @param queueSize the maximum number of Tasks that can be in the queue waiting to start executing at any time
* @param numThreads the number of threads to create. By default, this is set equal to the number of processors.
*/
explicit ParallelWorkQueue(int queueSize, int numThreads = ParallelExecutor::getNumProcessors());
/**
* Add a Task to the queue. If the queue is currently full, this method will block until space is freed up in
* the queue by the worker threads. The queue assumes ownership of the Task object and deletes it once it has
* finished executing.
*
* @param task the Task to add to the queue
*/
void addTask(Task* task);
/**
* Block until all Tasks that have been added to the queue finish executing.
*/
void flush();
};
/**
* Concrete subclasses of this abstract class represent tasks that can be executed by a ParallelWorkQueue.
*/
class ParallelWorkQueue::Task {
public:
virtual ~Task() {
}
/**
* This method defines the task to be performed. At some point after the Task is added to a
* ParallelWorkQueue, this method will be called by one of the worker threads.
*/
virtual void execute() = 0;
};
} // namespace SimTK
#endif // SimTK_SimTKCOMMON_PARALLEL_WORK_QUEUE_H_
|