wait

lock和wait+signal

送分小仙女□ 提交于 2020-03-02 02:38:00
lock和wait+signal 在编程中,我们经常使用多线程来提升性能,所以这就涉及到 互斥和同步 的问题了。而在编程中,我们一般都是通过如下方式来完成多线程的互斥和同步: lock | unlock signal + wait(timeout) join sleep C语言 在Linux C编程中,我们通常使用 pthread 类库来完成跨平台的多线程控制,如下是几个常用的API: pthread_mutex_lock():占有互斥锁(阻塞操作) pthread_mutex_unlock(): 释放互斥锁 pthread_cond_signal(): 唤醒第一个调用pthread_cond_wait()而进入睡眠的线程 pthread_cond_wait(): 等待条件变量的特殊条件发生 pthread_cond_timedwait():等待条件变量的特殊条件发生或者timeout pthread_join():阻塞当前的线程,直到另外一个线程运行结束 sleep() : 休眠固定时间, 不过这个API是Linux原生提供,不能跨平台。 注意:**pthread类库是glibc(绝大多数Linux平台标准C库。)的一部分。这些功能都是通过中断号进入内核来完成的,而非仅仅做了Linux兼容API。**具体可见 glibc-2.23\sysdeps\nacl\nacl

Object类中的wait()方法和notify()方法

老子叫甜甜 提交于 2020-02-28 18:48:48
【Object类中的wait()方法和notify()方法】 wait(): public final void wait(long timeout) throws InterruptedException 参数:等待的时间,可选,不填则默认为0。 说明: 1>使线程主动释放对象锁,并进入等待状态,直到它被其他线程通过notify()或notifyAll唤醒或者超过指定的等待时间。 2>在调用wait方法前,线程必须获得该对象的对象锁,即:只能在同步方法或同步代码块中调用wait方法,如果当前线程不是锁的持有者,将抛出一个IllegalMonitorStateException异常(是RuntimeException的子类,故不需要捕获)。 3>wait方法执行完成后,该线程立即释放持有的对象锁(注:不是等到退出synchronized代码块后才释放)。 4>this method should always be used in a loop: synchronized (obj) { // 不满足条件时等待。 while (condition does not hold) { obj.wait(); // 注:一般会有其它的线程当条件满足后调用notify方法 } // 满足条件时执行execute方法。 execute(); // 注

C++ wait/notify机制

久未见 提交于 2020-02-28 14:12:51
1,考虑如下Reader/Writer情景: 有一个共享FIFO,写线程往FIFO里面写数据,读线程从FIFO里面读取数据。 站在读者的角度,如果FIFO为空,读者有两种选择:一种是轮询FIFO,直到FIFO不空,读取数据。这种轮询的方式会占满CPU,浪费计算资源;另外一种是读者wait在某个等待队列上,主动放弃CPU资源,等待写者写入FIFO后,再唤醒等待在这个队列上的读者。这就是wait/notify机制。 C++的wait/notify实现需要信号量mutex和条件变量condition_variable共同实现。 2,C++中wait/notify实现示例: std::mutex mMutex; std::condition_variable<std::mutex> mCondVar; 写者线程(往mMsgQueue中写入message): { std::unique_lock<std::mutex> lock(mMutex); mMsgQueue.push_back(message); mCondVar.notify_all(); } 读者线程(从mMsgQueue中读取message): { std::unique_lock<std::mutex> lock(mMutex); mCondVar.wait(lock, [this] {return !this-

线程类Thread sleep 与wait的区别

南楼画角 提交于 2020-02-27 15:15:37
1、sleep是Thread类的方法,wait是Object类的方法 2、sleep不会释放对象锁,wait会释放锁 3、sleep不需要与synchronized一起使用,wait需要 4、sleep不需要唤醒,wait需要 import java.util.stream.Stream; public class DifferenceOfWaitAndSleep { private final static Object LOCK = new Object(); public static void main(String[] args) { Stream.of("T1", "T2").forEach(name -> new Thread(name) { @Override public void run() { m2(); } }.start() ); } public static void m1() { synchronized (LOCK) { try { System.out.println("The Thread " + Thread.currentThread().getName() + " enter."); Thread.sleep(20000); } catch (InterruptedException e) { e.printStackTrace(); }

java多线程(三):wait()、sleep()、 join()和yield()区别

末鹿安然 提交于 2020-02-25 00:32:29
前言 首先需要先了解 synchronized具体的使用方法 接着认识两个概念: 1.锁池 所有需要竞争同步锁的线程都会放在锁池当中,如果当前对象的锁已经被其中一个线程得到,则其他线程需要在这个锁池进行等待,当之前的线程释放同步锁后,锁池中的所有线程都会去竞争同步锁,当某个线程得到后会进入就绪队列进行等待cpu资源分配。 2.等待池 当我们调用wait()方法后,线程会放到等待池当中,等待池的线程是不会去竞争同步锁。只有调用了notify()或notifyAll()后等待池的线程才会开始去竞争锁,notify()是随机从等待池选出一个线程放到锁池,而notifyAll()是将等待池的所有线程放到锁池当中 区别 1.sleep()方法 在指定时间内让当前正在执行的线程暂停执行,但不会释放“锁标志”。sleep()使当前线程进入阻塞状态,在指定时间内不会执行。sleep()会指定休眠时间,线程休眠的时候会大于或者等于该休眠时间,当时间过后该线程会由“阻塞状态”编程“就绪状态”。 注意:sleep方法只是让出了cpu的执行权,并不会释放同步资源锁。 2.yield()方法 yield()方法和sleep()方法类似,也不会释放“锁标志”,区别在于,它没有参数,yield()的作用是让步,它能够让当前线程从“运行状态”进入到“就绪状态”,从而让其他等待线程获取执行权

Object中线程阻塞及唤醒方法的使用

隐身守侯 提交于 2020-02-23 11:59:50
Object中线程阻塞及唤醒方法使用 相关方法 挂起: wait()/wait(long timeout)/wait(long timeout, int nanos) 唤醒: notify()/notifyAll() 使用说明 调用对象的这些方法(wait/notify),必须先持有对象的监视器(monitor);否则会抛出IllegalMonitorStateException异常 例1: public static void main(String[] args) { Thread th1 = new Thread(){ @Override public void run() { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } }; th1.start(); } 运行结果: Exception in thread "Thread-0" java.lang.IllegalMonitorStateException at java.lang.Object.wait(Native Method) at java.lang.Object.wait(Object.java:503) at com.falco.src.verify.ObjectVerification$1.run

Qt 多线程

我与影子孤独终老i 提交于 2020-02-20 06:10:11
Qt线程类 Qt 包含下面一些线程相关的类: QThread 提供了开始一个新线程的方法 QThreadStorage 提供逐线程数据存储 QMutex 提供相互排斥的锁,或互斥量 QMutexLocker 是一个便利类,它可以自动对 QMutex 加锁与解锁 QReadWriterLock 提供了一个可以同时读操作的锁 QReadLocker 与 QWriteLocker 是便利类,它自动对 QReadWriteLock 加锁与解锁 QSemaphore 提供了一个整型信号量,是互斥量的泛化 QWaitCondition 提供了一种方法,使得线程可以在被另外线程唤醒之前一直休眠。 Qt线程的创建 Qt线程中有一个公共的抽象类,所有的线程都是从这个QThread抽象类中派生的,要实现QThread中的纯虚函数run(),run()函数是通过start()函数来实现调用的。 1 class MyThread : public QThread { 2 public : 3 virtual void run(); 4 }; 5 6 void MyThread::run() 7 { 8 for ( int count = 0 ; count < 20 ; count ++ ) { 9 sleep( 1 ); 10 qDebug( " Ping! " ); 11 } 12 } 13 14

Wait set time for user input C# console app

不想你离开。 提交于 2020-02-20 05:27:02
问题 For a Console app, I need to know how to wait at set amount of time (about 10 seconds), for a user to input a key or set of keys, before proceeding with an 'auto run' portion of the application. This is bugging me because I can't quite figure out how the timer works, or threading.sleep, what should I use? Been googling all day. some psuedocode: 1.app opens 2.app waits 10 secs for user to hit the "k" key. 3.if user hits k, go to 4. if user does not, go to 5. 4.run a function(open a form) 5.run

sleep和wait的区别

ε祈祈猫儿з 提交于 2020-02-11 15:38:57
/** * Sleep、WaitDemo * * @author suntao * @history 2020-02-11 14:30 suntao 新建 * @since JDK1.8 */ public class SleepWaitDemo { /** * sleep和wait的区别 * 1、sleep是Thread的方法,wait是Object类中的防范 * 2、sleep在任何地方都可以调用,wait只有在sychronized方法或sychronized块中进行使用; * 3、Thread.sleep只会让出cpu,不会导致对象锁的行为的改变; * Object.wait不仅可以让出cpu,也会释放锁 * @param args */ public static void main(String[] args) { Object lock = new Object(); new Thread(new Runnable() { @Override public void run() { System.out.println("Thread A wait get lock."); synchronized (lock){ System.out.println("Thread A get lock."); try { Thread.sleep(20); // 休眠20ms

Java Object.wait(long, long) Implementation different from Documentation

こ雲淡風輕ζ 提交于 2020-01-30 08:11:49
问题 The method Object#wait(long, long) in java.lang.Object states in it's documentation that This method is similar to the wait method of one argument, but it allows finer control over the amount of time to wait for a notification before giving up. The amount of real time, measured in nanoseconds, is given by: 1000000*timeout+nanos This in itself makes sense, but the implementation does not reflect the documentation: public final void wait(long timeout, int nanos) throws InterruptedException { //