本文整理汇总了C++中utilities::thread::Condition类的典型用法代码示例。如果您正苦于以下问题:C++ Condition类的具体用法?C++ Condition怎么用?C++ Condition使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了Condition类的13个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: become_dependent
void become_dependent(THREAD, utilities::thread::Condition* cond = NULL) {
switch(state->run_state()) {
case ManagedThread::eAlone:
// Running alone, ignore.
return;
case ManagedThread::eRunning:
// Ignore this, a running thread is already dependent.
return;
case ManagedThread::eSuspended:
// Again, bad, don't allow this.
rubinius::bug("Trying to make a suspended thread dependent");
break;
case ManagedThread::eIndependent:
for(;;) {
// If the GC is running, wait here...
if(should_stop_) {
utilities::thread::Mutex::LockGuard guard(mutex_);
state->run_state_ = ManagedThread::eSuspended;
if(cond) cond->broadcast();
// We need to grab the mutex because we might want
// to wait here.
while(should_stop_) {
waiting_to_run_.wait(mutex_);
}
}
// Ok, we're running again.
state->run_state_ = ManagedThread::eRunning;
atomic::fetch_and_add(&pending_threads_, 1);
// After decreasing the thread count, we have to check whether
// we might have to stop. This is basically because
// there is a race condition here that should_stop isn't true
// yet the first time before incrementing. However, another thread
// waiting to GC could have set should_stop and not seen the
// increment of this thread yet, thinking it's safe to GC.
//
if(!atomic::read(&should_stop_)) return;
// If we do have to stop, subtract one from the thread count
// and retry again. This will make the thread go into the wait.
atomic::fetch_and_sub(&pending_threads_, 1);
}
}
}
开发者ID:Halfnhav,项目名称:rubinius,代码行数:43,代码来源:world_state.hpp
示例2: perform
virtual void perform() {
const char* thread_name = "rbx.jit";
ManagedThread::set_current(ls_, thread_name);
ls_->set_run_state(ManagedThread::eIndependent);
RUBINIUS_THREAD_START(thread_name, ls_->thread_id(), 1);
#ifndef RBX_WINDOWS
sigset_t set;
sigfillset(&set);
pthread_sigmask(SIG_SETMASK, &set, NULL);
#endif
for(;;) { // forever
BackgroundCompileRequest* req = 0;
// Lock, wait, get a request, unlock
{
utilities::thread::Mutex::LockGuard guard(mutex_);
if(pause_) {
state = cPaused;
paused_ = true;
pause_condition_.broadcast();
if(stop_) goto halt;
while(pause_) {
condition_.wait(mutex_);
if(stop_) goto halt;
}
state = cUnknown;
paused_ = false;
}
// If we've been asked to stop, do so now.
if(stop_) goto halt;
while(pending_requests_.empty()) {
state = cIdle;
// unlock and wait...
condition_.wait(mutex_);
if(stop_) goto halt;
}
// now locked again, shift a request
req = pending_requests_.front();
state = cRunning;
}
// This isn't ideal, but it's the safest. Keep the GC from
// running while we're building the IR.
ls_->gc_dependent();
Context ctx(ls_);
jit::Compiler jit(&ctx);
// mutex now unlock, allowing others to push more requests
//
current_req_ = req;
current_compiler_ = &jit;
int spec_id = 0;
Class* cls = req->receiver_class();
if(cls && !cls->nil_p()) {
spec_id = cls->class_id();
}
void* func = 0;
{
timer::Running<1000000> timer(ls_->shared().stats.jit_time_spent);
jit.compile(req);
func = jit.generate_function();
}
// We were unable to compile this function, likely
// because it's got something we don't support.
if(!func) {
if(ls_->config().jit_show_compiling) {
CompiledCode* code = req->method();
llvm::outs() << "[[[ JIT error background compiling "
<< ls_->enclosure_name(code) << "#" << ls_->symbol_debug_str(code->name())
<< (req->is_block() ? " (block)" : " (method)")
<< " ]]]\n";
}
// If someone was waiting on this, wake them up.
if(utilities::thread::Condition* cond = req->waiter()) {
cond->signal();
}
//.........这里部分代码省略.........
开发者ID:dziulius,项目名称:rubinius,代码行数:101,代码来源:state.cpp
示例3: restart
void restart() {
mutex_.init();
condition_.init();
pause_condition_.init();
state = cUnknown;
stop_ = false;
pause_ = false;
paused_ = false;
run();
}
开发者ID:dziulius,项目名称:rubinius,代码行数:12,代码来源:state.cpp
示例4: BackgroundCompilerThread
BackgroundCompilerThread(LLVMState* ls)
: Thread(0, false)
, ls_(ls)
, current_compiler_(0)
, current_req_(0)
, state(cUnknown)
, stop_(false)
, pause_(false)
, paused_(false)
{
show_machine_code_ = ls->jit_dump_code() & cMachineCode;
condition_.init();
pause_condition_.init();
}
开发者ID:dziulius,项目名称:rubinius,代码行数:14,代码来源:state.cpp
示例5: unpark
void unpark() {
utilities::thread::Mutex::LockGuard lg(mutex_);
if(!sleeping_) return;
wake_ = true;
cond_.signal();
}
开发者ID:JesseChavez,项目名称:rubinius,代码行数:7,代码来源:park.hpp
示例6: wake_all_waiters
void wake_all_waiters(THREAD) {
utilities::thread::Mutex::LockGuard guard(mutex_);
if(!atomic::compare_and_swap(&should_stop_, 1, 0)) {
// Ok, someone else has already restarted so we don't
// have anything to do here anymore
return;
}
if(cDebugThreading) {
std::cerr << "[" << VM::current() << " WORLD waking all threads]\n";
}
if(state->run_state_ != ManagedThread::eAlone) {
rubinius::bug("A non-alone thread is trying to wake all");
}
*check_global_interrupts_ = false;
// For ourself..
atomic::fetch_and_add(&pending_threads_, 1);
waiting_to_run_.broadcast();
state->run_state_ = ManagedThread::eRunning;
}
开发者ID:Halfnhav,项目名称:rubinius,代码行数:25,代码来源:world_state.hpp
示例7: WorldState
WorldState(bool* check_global_interrupts)
: pending_threads_(0)
, should_stop_(0)
, check_global_interrupts_(check_global_interrupts)
, time_waiting_(0)
{
mutex_.init();
waiting_to_run_.init();
}
开发者ID:Halfnhav,项目名称:rubinius,代码行数:9,代码来源:world_state.hpp
示例8: unpause
void unpause() {
utilities::thread::Mutex::LockGuard guard(mutex_);
// idle, just waiting for more work, ok, thats fine.
if(state != cPaused) return;
pause_ = false;
condition_.signal();
}
开发者ID:dziulius,项目名称:rubinius,代码行数:10,代码来源:state.cpp
示例9: pause
void pause() {
utilities::thread::Mutex::LockGuard guard(mutex_);
// it's idle, ie paused.
if(state == cIdle || state == cPaused) return;
pause_ = true;
while(!paused_ && (ls_->run_state() == ManagedThread::eRunning ||
ls_->run_state() == ManagedThread::eIndependent)) {
pause_condition_.wait(mutex_);
}
}
开发者ID:dziulius,项目名称:rubinius,代码行数:13,代码来源:state.cpp
示例10: stop
void stop() {
{
utilities::thread::Mutex::LockGuard guard(mutex_);
if(state == cStopped) return;
stop_ = true;
if(state == cIdle) {
condition_.signal();
} else if(state == cPaused) {
// TODO refactor common from unpause
pause_ = false;
condition_.signal();
}
}
join();
{
utilities::thread::Mutex::LockGuard guard(mutex_);
state = cStopped;
}
}
开发者ID:dziulius,项目名称:rubinius,代码行数:23,代码来源:state.cpp
示例11: stop_threads_externally
void stop_threads_externally() {
while(!atomic::compare_and_swap(&should_stop_, 0, 1)) {
if(cDebugThreading) {
std::cerr << "[WORLD waiting to stopping all threads (as external event)]\n";
}
// Wait around on the run condition variable until whoever is currently
// working independently is done and sets should_stop_ to false.
utilities::thread::Mutex::LockGuard guard(mutex_);
while(should_stop_) {
waiting_to_run_.wait(mutex_);
}
// We will now redo the loop to check if we can stop properly this time
}
if(cDebugThreading) {
std::cerr << "[WORLD stopping all threads (as external event)]\n";
}
*check_global_interrupts_ = true;
// We need a write barrier so we're sure we're seeing an up to
// date version of pending_threads_ in each loop.
while(atomic::read(&pending_threads_) > 0) {
if(cDebugThreading) {
std::cerr << "[" << VM::current() << " WORLD waiting on condvar: "
<< pending_threads_ << "]\n";
}
// We yield here so other threads are scheduled and can be run.
// We've benchmarked this and this turned out to cause the least
// cpu burn compared to not doing anything at all here or sleeping
// for 1 nanosecond with {0, 1}.
atomic::pause();
}
if(cDebugThreading) {
std::cerr << "[" << VM::current() << " WORLD o/~ I think we're alone now.. o/~]\n";
}
}
开发者ID:Halfnhav,项目名称:rubinius,代码行数:37,代码来源:world_state.hpp
示例12: unlock
void unlock() {
stop_ = false;
wait_condition_.broadcast();
lock_.unlock();
}
开发者ID:clockmaker002,项目名称:rubinius,代码行数:5,代码来源:thread_nexus.hpp
示例13: add
void add(BackgroundCompileRequest* req) {
utilities::thread::Mutex::LockGuard guard(mutex_);
pending_requests_.push_back(req);
condition_.signal();
}
开发者ID:dziulius,项目名称:rubinius,代码行数:5,代码来源:state.cpp
注:本文中的utilities::thread::Condition类示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论