acquire_sem()需要什么头文件

acquire_sem()需要什么头文件,第1张

sem_acquire

(PHP3 >= 3.0.6, PHP4)

sem_acquire --- 获得信号

语法 : int sem_acquire (int sem_identifier)

说明 :

成功则传回true,失败则传回false。

sem_acquire( )封锁(非必要的话)直到信号能被获得,如果获得信号超出max_acquire的值,则会先锁住信号再试着去获得信号。

在处理一请求之后,任何以处理所获得的信号但是却没有明确的释放,将会自动地释放并且将会产生警告。

Python进阶(二十六)-多线程实现同步的四种方式

临界资源即那些一次只能被一个线程访问的资源,典型例子就是打印机,它一次只能被一个程序用来执行打印功能,因为不能多个线程同时操作,而访问这部分资源的代码通常称之为临界区。

锁机制

threading的Lock类,用该类的acquire函数进行加锁,用realease函数进行解锁

import threadingimport timeclass Num:

def __init__(self):

self.num = 0

self.lock = threading.Lock()def add(self):

self.lock.acquire()#加锁,锁住相应的资源

self.num += 1

num = self.num

self.lock.release()#解锁,离开该资源

return num

n = Num()class jdThread(threading.Thread):

def __init__(self,item):

threading.Thread.__init__(self)

self.item = itemdef run(self):

time.sleep(2)

value = n.add()#将num加1,并输出原来的数据和+1之后的数据

print(self.item,value)for item in range(5):

t = jdThread(item)

t.start()

t.join()#使线程一个一个执行12345678910111213141516171819202122232425262728

当一个线程调用锁的acquire()方法获得锁时,锁就进入“locked”状态。每次只有一个线程可以获得锁。如果此时另一个线程试图获得这个锁,该线程就会变为“blocked”状态,称为“同步阻塞”(参见多线程的基本概念)。

直到拥有锁的线程调用锁的release()方法释放锁之后,锁进入“unlocked”状态。线程调度程序从处于同步阻塞状态的线程中选择一个来获得锁,并使得该线程进入运行(running)状态。

信号量

信号量也提供acquire方法和release方法,每当调用acquire方法的时候,如果内部计数器大于0,则将其减1,如果内部计数器等于0,则会阻塞该线程,知道有线程调用了release方法将内部计数器更新到大于1位置。

import threadingimport timeclass Num:

def __init__(self):

self.num = 0

self.sem = threading.Semaphore(value = 3)#允许最多三个线程同时访问资源

def add(self):

self.sem.acquire()#内部计数器减1

self.num += 1

num = self.num

self.sem.release()#内部计数器加1

return num

n = Num()class jdThread(threading.Thread):

def __init__(self,item):

threading.Thread.__init__(self)

self.item = itemdef run(self):

time.sleep(2)

value = n.add()

print(self.item,value)for item in range(100):

import java.util.concurrent.Semaphore

class Q { //仓库

int n//仓库中的产品

// Start with consumer semaphore unavailable.

static Semaphore semCon = new Semaphore(0)

static Semaphore semProd = new Semaphore(1)

void get() {

try {

semCon.acquire()

} catch(InterruptedException e) {

System.out.println("InterruptedException caught")

}

System.out.println("Got: " + n)

semProd.release()

}

void put(int n) {

try {

semProd.acquire()

} catch(InterruptedException e) {

System.out.println("InterruptedException caught")

}

this.n = n

System.out.println("Put: " + n)

semCon.release()

}

}

class Producer implements Runnable { //生产者

Q q

Producer(Q q) {

this.q = q

new Thread(this, "Producer").start()

}

public void run() {

for(int i=0i <20i++) q.put(i)

}

}

class Consumer implements Runnable { //消费者

Q q

Consumer(Q q) {

this.q = q

new Thread(this, "Consumer").start()

}

public void run() {

for(int i=0i <20i++) q.get()

}

}

class ProdCon { //测试类

public static void main(String args[]) {

Q q = new Q()

new Consumer(q)

new Producer(q)

}

}

}


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/121434.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-14
下一篇2023-03-14

发表评论

登录后才能评论

评论列表(0条)

    保存