1 #ifndef ALL_DISTANCE_SKETCH_ALL_DISTANCE_SKETCH_UTILS_THREAD_UTILS_H_
2 #define ALL_DISTANCE_SKETCH_ALL_DISTANCE_SKETCH_UTILS_THREAD_UTILS_H_
11 void InitModuloLock(
unsigned int anum_locks_ = 1048576) {
12 locks_ =
new std::mutex[anum_locks_];
13 num_locks_ = anum_locks_;
15 void Lock(
unsigned int aObjectId) {
16 while ( (locks_ + (aObjectId % num_locks_))->try_lock() ==
false ) {
20 void UnLock(
unsigned int aObjectId) {
21 (locks_ + (aObjectId % num_locks_))->unlock();
23 int GetNumCollitions() {
31 unsigned int num_locks_;
36 Message() : start_index(0), end_index(0), insert_to_candidate_list(false), clear_candidate_list(false) {}
37 unsigned int start_index;
38 unsigned int end_index;
39 bool insert_to_candidate_list;
40 bool clear_candidate_list;
43 class MessageChannel {
45 void InitMessageChannel(
unsigned int aNumThreads) {
47 threadStatus.resize(aNumThreads,
false);
54 bool get_should_stop() {
58 void AddBatch(
unsigned int aStartIndex,
unsigned int aEndIndex,
bool aExec,
bool aClean) {
61 m.start_index = aStartIndex;
62 m.end_index = aEndIndex;
63 m.insert_to_candidate_list = aExec;
64 m.clear_candidate_list = aClean;
65 myMessages.push_back(m);
68 bool GetMessage(Message * m,
unsigned int id) {
71 if (myMessages.size() > 0) {
72 (*m) = myMessages.front();
73 myMessages.pop_front();
74 threadStatus[id] =
true;
86 if (myMessages.size() != 0) {
90 for (
unsigned int i=0; i < threadStatus.size(); i++) {
91 if (threadStatus[i] ==
true) {
99 void Finished(
unsigned int id) {
101 threadStatus[id] =
false;
106 std::list< Message > myMessages;
107 unsigned int end_index;
110 std::vector<bool> threadStatus;