Generated on Tue Jan 26 2021 00:00:00 for Gecode by doxygen 1.9.1
thread.cpp
Go to the documentation of this file.
1 /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
2 /*
3  * Main authors:
4  * Christian Schulte <schulte@gecode.org>
5  *
6  * Copyright:
7  * Christian Schulte, 2009
8  *
9  * This file is part of Gecode, the generic constraint
10  * development environment:
11  * http://www.gecode.org
12  *
13  * Permission is hereby granted, free of charge, to any person obtaining
14  * a copy of this software and associated documentation files (the
15  * "Software"), to deal in the Software without restriction, including
16  * without limitation the rights to use, copy, modify, merge, publish,
17  * distribute, sublicense, and/or sell copies of the Software, and to
18  * permit persons to whom the Software is furnished to do so, subject to
19  * the following conditions:
20  *
21  * The above copyright notice and this permission notice shall be
22  * included in all copies or substantial portions of the Software.
23  *
24  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
28  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
29  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
30  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31  *
32  */
33 
34 #include <gecode/support.hh>
35 
36 namespace Gecode { namespace Support {
37 
38  /*
39  * Threads
40  */
41 
42  Mutex* Thread::m(void) {
43  static Mutex* m = new Mutex;
44  return m;
45  }
46 
47  Thread::Run* Thread::idle = NULL;
48 
49  void
51  while (true) {
52  // Execute runnable
53  {
54  Runnable* e;
55  m.acquire();
56  GECODE_ASSUME(r != NULL);
57  e=r; r=NULL;
58  m.release();
59  assert(e != NULL);
60  e->run();
61  if (e->todelete()) {
62  Terminator* t = e->terminator();
63  delete e;
64  if (t)
65  t->terminated();
66  }
67  }
68  // Put into idle stack
69  Thread::m()->acquire();
71  Thread::m()->release();
72  // Wait for next runnable
73  e.wait();
74  }
75  }
76 
77 }}
78 
79 // STATISTICS: support-any
NodeType t
Type of node.
Definition: bool-expr.cpp:230
void wait(void)
Wait until the event becomes signalled.
Definition: none.hpp:61
A mutex for mutual exclausion among several threads.
Definition: thread.hpp:96
void release(void)
Release the mutex.
Definition: none.hpp:48
void acquire(void)
Acquire the mutex and possibly block.
Definition: none.hpp:42
An interface for objects that can be run by a thread.
Definition: thread.hpp:264
An interface for objects that can be called after a thread has terminated (after running the thread's...
Definition: thread.hpp:251
void exec(void)
Infinite loop for execution.
Definition: thread.cpp:50
Event e
Event to wait for next runnable object to execute.
Definition: thread.hpp:306
Run * n
Next idle thread.
Definition: thread.hpp:302
Runnable * r
Runnable object to execute.
Definition: thread.hpp:304
Mutex m
Mutex for synchronization.
Definition: thread.hpp:308
static Run * idle
Idle runners.
Definition: thread.hpp:323
static Mutex * m(void)
Mutex for synchronization.
Definition: thread.cpp:42
#define GECODE_ASSUME(p)
Assert certain property.
Definition: macros.hpp:114