标签: locks

如何在VC++中创建锁?

可以说我正在实现一个关键部分并在VC++中保护一些数组,我如何使用VC++中的锁来实现呢?

windows winapi multithreading visual-c++ locks

2
推荐指数
1
解决办法
3093
查看次数

如何避免嵌套同步和导致的死锁

我需要在一个功能中锁定两个对象,并且当前代码如下所示;

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锁来避免这种情况?

我正在考虑维护一个物体及其锁的地图,并验证它们是否可以使用,但似乎无法想出一种可以预测锁定顺序的清洁方式.

java concurrency locks

2
推荐指数
1
解决办法
3889
查看次数

在多线程应用程序中记录锁获取和释放调用

我正在尝试调试使用各种锁的多线程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 debugging multithreading decorator locks

2
推荐指数
1
解决办法
3796
查看次数

在try块中获取

我正在研究一本开源的中级Python书籍,并讨论了许多PEP.在PEP310中,有一个关于"with"语句的旧提议.该提议最终被驳回,但以下声明让我感到震惊:"另一个常见错误是在try块内编码"acquire"调用,如果获取失败,则会错误地释放锁定."

有人可以详细说明如何将获取置于试验中改变事物吗?根据我的理解,在Python中获取调用只返回一个布尔值,指示锁是否已成功获取,那么如何将它放入try块中更改内容?

python locks

2
推荐指数
1
解决办法
745
查看次数

哈希映射的线程安全实现

首先,我将描述我想要的内容,然后我会详细说明我正在考虑的可能性.我不知道哪个最好,所以我想要一些帮助.

我有一个哈希映射,我从中读取和写入操作Servlet.现在,因为这Servlet是在Tomcat上,我需要哈希映射是线程安全的.基本上,当它被写入时,没有别的东西应该写入它,也没有任何东西也应该能够读取它.

我已经看到ConcurrentHashMap但是注意到它的get方法不是线程安全的.然后,我看到了锁和一些叫做synchronized的东西.

我想知道哪种方法最可靠.

java thread-safety concurrenthashmap locks

2
推荐指数
2
解决办法
1万
查看次数

自定义锁线程python

嗨我正在使用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)

谢谢

python multithreading pyqt4 locks

2
推荐指数
1
解决办法
3045
查看次数

SQL Server数据库:使用等待类型LCK_M_IX阻止INSERT查询

我们的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)

database sql-server database-deadlocks locks

2
推荐指数
1
解决办法
5297
查看次数

如何使用Python中的锁保护对象?

我遇到了需要以下模式的功能:

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)

但它感觉非常基本,它应该存在于标准库中,或者它是一种非常规的使用锁的方式.

python multithreading locks

2
推荐指数
1
解决办法
2983
查看次数

MySQL行级锁

我不确定行级别锁如何工作但这里是我的问题我有一个表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行而不是完全锁定表格?

mysql database innodb transactions locks

2
推荐指数
1
解决办法
1005
查看次数

同步方法与ReentrantLock

假设我有一台具有多个线程的服务器,这些线程共享对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)

java concurrency multithreading locks

2
推荐指数
1
解决办法
2448
查看次数