可以说我正在实现一个关键部分并在VC++中保护一些数组,我如何使用VC++中的锁来实现呢?
我需要在一个功能中锁定两个对象,并且当前代码如下所示;
Object obj1 = ...//get from somewhere
Object obj2 = ...//get from somewhere
synchronized(obj1){
...//blah
synchronized(obj2){
...//blah
}
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,如果另一个线程使用obj1运行这段代码并且两个反转,这是一个简单而直接的死锁配方.
有没有办法使用concurrency-utils锁来避免这种情况?
我正在考虑维护一个物体及其锁的地图,并验证它们是否可以使用,但似乎无法想出一种可以预测锁定顺序的清洁方式.
我正在尝试调试使用各种锁的多线程Python应用程序.
而不是在整个镜头中放置log.debug(...)语句来跟踪获取和释放锁的位置和时间,我的想法是装饰方法threading.Lock.acquire()和threading.Lock.release(),并使用以下内容为其调用添加前缀:
log.debug("lock::acquire() [%s.%s.%s]" %
(currentThread().getName(),
self.__class__.__name__,
sys._getframe().f_code.co_name))
Run Code Online (Sandbox Code Playgroud)
其中log是一些全局日志记录对象 - 为了讨论.
理想情况下,日志条目中的名称"lock"应该在运行时派生,这样无论在日志上调用这些方法的哪个锁定对象都将输出其名称,操作装饰,当前线程,类和函数,其中调用操作(获取|释放).
免责声明:我承认上面给出的代码对于任何这样的装饰器实现都是不够的.它仅用于提供我认为可以实现的内容.
有没有人知道我是否可以装饰标准库方法,而无需修改线程库的原始源代码,即从我的调用应用程序代码中查找?
也许我正在咆哮错误的树,有一种更好的方法来实现相同的目的,而不使用装饰器?如果情况确实如此,请提前感谢任何指导.
解决方案:(灵感来自lazyr)
以下代码记录了锁定操作,并给出了调用锁定操作的方法/函数的名称(我还调整了代码以使用条件及其附加的wait()和notify()方法):
# Class to wrap Lock and simplify logging of lock usage
class LogLock(object):
"""
Wraps a standard Lock, so that attempts to use the
lock according to its API are logged for debugging purposes
"""
def __init__(self, name, log):
self.name = str(name) …Run Code Online (Sandbox Code Playgroud) 我正在研究一本开源的中级Python书籍,并讨论了许多PEP.在PEP310中,有一个关于"with"语句的旧提议.该提议最终被驳回,但以下声明让我感到震惊:"另一个常见错误是在try块内编码"acquire"调用,如果获取失败,则会错误地释放锁定."
有人可以详细说明如何将获取置于试验中改变事物吗?根据我的理解,在Python中获取调用只返回一个布尔值,指示锁是否已成功获取,那么如何将它放入try块中更改内容?
首先,我将描述我想要的内容,然后我会详细说明我正在考虑的可能性.我不知道哪个最好,所以我想要一些帮助.
我有一个哈希映射,我从中读取和写入操作Servlet.现在,因为这Servlet是在Tomcat上,我需要哈希映射是线程安全的.基本上,当它被写入时,没有别的东西应该写入它,也没有任何东西也应该能够读取它.
我已经看到ConcurrentHashMap但是注意到它的get方法不是线程安全的.然后,我看到了锁和一些叫做synchronized的东西.
我想知道哪种方法最可靠.
嗨我正在使用PyQt4,我需要在QThread中实现锁,但是这个类没有像库线程一样实现的方法锁.知道怎样才能在这里实现锁定?
我有一个问题,如果我使用线程我实现这样的锁
class Example:
lock = threading.Lock()
def __init__(self)
pass
def run(self):
Example.lock.acquire()
.......
........
Example.lock.realease()
Run Code Online (Sandbox Code Playgroud)
这是一样的吗?:
class Example(QtCore.QThread):
mutex = QtCore.QMutex())
def __init__(self)
pass
def run(self):
mutex.lock()
.......
........
mutex.unlock()
Run Code Online (Sandbox Code Playgroud)
谢谢
我们的Java应用程序通过cron作业清除日志表中的数据.以下是为清理而执行的查询:
DELETE FROM AU_TRANSACTIONDATA
WHERE AU_ACTIVITYENDTIME != 0
AND AU_ACTIVITYENDTIME <= 1464570001151
Run Code Online (Sandbox Code Playgroud)
我们在AU_ACTIVITYENDTIME这个表的列上有一个索引:
CREATE INDEX [IX_AU_TRANSDATA_ENDTIME]
ON [AU_TRANSACTIONDATA]([AU_ACTIVITYENDTIME]) ON [PRIMARY];
Run Code Online (Sandbox Code Playgroud)
我们的应用程序将事务数据(在我们的应用程序中执行API时生成)转储到此表中.这是INSERT查询:
INSERT INTO AU_TRANSACTIONDATA (AU_TRANSACTIONID, AU_TRANSACTIONNAME, AU_TRANSACTIONDOMAINID, AU_ACTIVITYNAME, AU_ACTIVITYID, AU_ACTIVITYPID, AU_ACTIVITYTYPE, AU_ACTIVITYSTARTTIME, AU_ACTIVITYENDTIME, AU_ACTIVITYSTATUS, AU_CORRECTDATA, AU_ERRORDATA, AU_USERID, AU_GROUPID, AU_NODENAME, AU_TRANSACTIONDESCRIPTION, AU_SEQUENCEID, AU_TRANSSEQUENCEID)
VALUES (@P0, @P1, @P2, @P3, @P4, @P5, @P6, @P7, @P8, @P9, @P10, @P11, @P12, @P13, @P14, @P15, @P16, @P17)
Run Code Online (Sandbox Code Playgroud)
当日志清理(DELETE查询)和数据处理(INSERT查询)同时发生时,我们面临问题.我们有大约150万条记录用于清理,因此删除查询需要一些时间来清理日志记录.但在此期间,处理被阻止,没有INSERT查询通过.
这是日志:
SPID at Head of Blocking Chain:
SPID [ecid]: 3524 …Run Code Online (Sandbox Code Playgroud) 我遇到了需要以下模式的功能:
from threading import Lock
the_list = []
the_list_lock = Lock()
Run Code Online (Sandbox Code Playgroud)
并使用它:
with the_list_lock:
the_list.append("New Element")
Run Code Online (Sandbox Code Playgroud)
不幸的是,这并不需要我获取锁,我可以直接访问该对象.我希望得到一些保护(我只是人类.)有没有一种标准的方法来做到这一点?我自己的方法是创建一个HidingLock可以像这样使用的类:
the_list = HidingLock([])
with the_list as l:
l.append("New Element")
Run Code Online (Sandbox Code Playgroud)
但它感觉非常基本,它应该存在于标准库中,或者它是一种非常规的使用锁的方式.
我不确定行级别锁如何工作但这里是我的问题我有一个表T(id int,balance int)(engine = InnoDB)我想要锁定ID = 1的行,所以我开始像这个 :
start transaction ;
select * from T where ID = 1 FOR UPDATE ;
Run Code Online (Sandbox Code Playgroud)
在发送提交之前,我想尝试确实行是否已锁定.所以我开始了另一个会话并输入:
UPDATE T set balance = balance + 100 where ID = 1 ;
Run Code Online (Sandbox Code Playgroud)
在这里,我清楚地看到我在等待锁定(30秒后超时).
但是当我键入:
UPDATE T set balance = balance + 8500 where ID = 2 ;
Run Code Online (Sandbox Code Playgroud)
我也在等待锁定,那么我怎样才能锁定ID = 1行而不是完全锁定表格?
假设我有一台具有多个线程的服务器,这些线程共享对Data实例的引用。快速例如
edit1:已更新以提高可读性
public void main() {
Data data = new Data();
ReentrantLock rl = new ReentrantLock(true);
ReadThread t1 = new ReadThread(data, rl);
UploadThread t2 = new UploadThread(data, rl);
t1.start(); t2.start();
}
class ReadThread extends Thread {
private Data data;
private ReentrantLock lock;
ReadThread(Data d, ReentrantLock l){ data = d; lock = l; }
void run(){
lock.lock();
try{
data.put(aString)
} finally { lock.unlock(); }
}
}
class UploadThread extends Thread {
private Data data;
private ReentrantLock lock;
UploadThread(Data d, ReentrantLock l){ …Run Code Online (Sandbox Code Playgroud) locks ×10
python ×4
java ×3
concurrency ×2
database ×2
debugging ×1
decorator ×1
innodb ×1
mysql ×1
pyqt4 ×1
sql-server ×1
transactions ×1
visual-c++ ×1
winapi ×1
windows ×1