Google OR-Tools: ortools/base/threadpool.h Source File

Loading...

Searching...

No Matches

Go to the documentation of this file.

1

2

3

4

5

6

7

8

9

10

11

12

13

14#ifndef ORTOOLS_BASE_THREADPOOL_H_

15#define ORTOOLS_BASE_THREADPOOL_H_

16

17#include <cstddef>

18#include <deque>

19#include <optional>

20#include <thread>

21#include <vector>

22

23#include "absl/base/nullability.h"

24#include "absl/base/thread_annotations.h"

25#include "absl/functional/any_invocable.h"

26#include "absl/strings/string_view.h"

27#include "absl/synchronization/mutex.h"

28

30

32 public:

34 ThreadPool(absl::string_view prefix, int num_threads);

36

37 void Schedule(absl::AnyInvocable<void() &&> callback);

38

39 private:

40

41 struct Waiter {

42 absl::CondVar cv;

43 };

44

45

46

47

48 void SpawnThread() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mutex_);

49

50 void RunWorker();

51

52

53

54

55 std::optional<absl::AnyInvocable<void() &&>> DequeueWork()

56 ABSL_LOCKS_EXCLUDED(mutex_);

57

58

59

60

61

62 void SignalWaiter() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mutex_);

63

64 mutable absl::Mutex mutex_;

65 absl::CondVar wait_nonfull_ ABSL_GUARDED_BY(mutex_);

66 std::vector<Waiter* absl_nonnull> waiters_ ABSL_GUARDED_BY(mutex_);

67 const size_t max_threads_;

68 std::deque<absl::AnyInvocable<void() &&>> queue_;

69 bool stopping_ ABSL_GUARDED_BY(mutex_) = false;

70 size_t running_threads_ ABSL_GUARDED_BY(mutex_) = 0;

71 std::vector<std::thread> threads_ ABSL_GUARDED_BY(mutex_);

72};

73

74}

75#endif

ThreadPool(int num_threads)

void Schedule(absl::AnyInvocable< void() && > callback)