main page
modules
namespaces
classes
files
Gecode home
Generated on Sun Aug 9 2020 05:34:08 for Gecode by
doxygen
1.8.18
gecode
support
thread
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
50
Thread::Run::exec
(
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
();
70
n
=
Thread::idle
;
Thread::idle
=
this
;
71
Thread::m
()->
release
();
72
// Wait for next runnable
73
e
.
wait
();
74
}
75
}
76
77
}}
78
79
// STATISTICS: support-any
Gecode::Support::Thread::Run::exec
void exec(void)
Infinite loop for execution.
Definition:
thread.cpp:50
Gecode::Support::Thread::m
static Mutex * m(void)
Mutex for synchronization.
Definition:
thread.cpp:42
Gecode::Support::Thread::Run::n
Run * n
Next idle thread.
Definition:
thread.hpp:302
Gecode::Support::Mutex::acquire
void acquire(void)
Acquire the mutex and possibly block.
Definition:
none.hpp:42
t
NodeType t
Type of node.
Definition:
bool-expr.cpp:230
Gecode::Support::Thread::Run::e
Event e
Event to wait for next runnable object to execute.
Definition:
thread.hpp:306
Gecode::Support::Thread::Run
A real thread.
Definition:
thread.hpp:299
Gecode
Gecode toplevel namespace
Gecode::Support::Terminator
An interface for objects that can be called after a thread has terminated (after running the thread's...
Definition:
thread.hpp:251
Gecode::Support::Thread::Run::m
Mutex m
Mutex for synchronization.
Definition:
thread.hpp:308
Gecode::Support::Thread::idle
static Run * idle
Idle runners.
Definition:
thread.hpp:323
Gecode::Support::Thread::Run::r
Runnable * r
Runnable object to execute.
Definition:
thread.hpp:304
support.hh
Gecode::Support::Runnable
An interface for objects that can be run by a thread.
Definition:
thread.hpp:264
Gecode::Support::Mutex::release
void release(void)
Release the mutex.
Definition:
none.hpp:48
Gecode::Support::Mutex
A mutex for mutual exclausion among several threads.
Definition:
thread.hpp:96
Gecode::Support::Event::wait
void wait(void)
Wait until the event becomes signalled.
Definition:
none.hpp:61
GECODE_ASSUME
#define GECODE_ASSUME(p)
Assert certain property.
Definition:
macros.hpp:114