-
互斥锁问题
2015-07-30 15:16:13互斥锁保证每时刻每个用户看到的共享数据是一样的。只有lock与unlock两种状态,确保同一时间只有一个线程访问数据。 在同一时间通常只允许一个线程执行部分代码。 使用互斥锁前必须进行初始化操作。 (1)pthread_...互斥锁保证每时刻每个用户看到的共享数据是一样的。只有lock与unlock两种状态,确保同一时间只有一个线程访问数据。
在同一时间通常只允许一个线程执行部分代码。
使用互斥锁前必须进行初始化操作。
(1)pthread_mutex_t = PTHREAD_MUTEX_INITIALIZER;
(2)int pthread_mutex_init (pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);
互斥锁锁住的并不是一个变量,而是阻塞一段程序。如果对一个mutex变量执行了第一次lock之后,在unlock前的这短时间内,如果有其他线程也只行到了lock,这个线程就会阻塞住,知道之前的lock解锁之后才能执行。
加锁:
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pyhread_mutex_trylock(pthread_mutex_t *mutex);
若mutex已经被加锁则lock会等带其解锁再加锁运行后面的程序,而trylock若遇到mutex以加锁则立即返回返回的错误代码为EBUSY,而不是阻塞等待。
解锁:
int pthread_mutex_unlock(pthread_mutex_t *mutex);
解锁时需要满足两个条件,一时互斥锁处于加锁状态,二是调用unlock的线程必须是给互斥锁加锁的线程;
int pthread_thread_delete(pthread_mutex_destory);
清楚一个互斥锁意味着释放其占有的资源清除锁时要求当前处于开放状态。
-
python互斥锁问题_Python学习之互斥锁和死锁
2020-12-11 13:20:36Python——互斥锁1.进程之间的数据不能共享,但是共享同一套文件系统,所以访问同一个文件,或者同一个打印终端,是没有问题的,而共享带来的是竞争竞争带来是错乱2.如何控制,就是加锁处理,而互斥锁就是互相排斥,...Python——互斥锁
1.进程之间的数据不能共享,但是共享同一套文件系统,所以访问同一个文件,或者同一个打印终端,是没有问题的,而共享带来的是竞争竞争带来是错乱
2.如何控制,就是加锁处理,而互斥锁就是互相排斥,假设把多个进程比喻成多个人,互斥锁的工作原理是多个人都要去争抢同一个资源:比如抢一个房间,谁先抢到这个资源就暂时先占为己有然后上个锁,然后在他占用的时间段内别人是要等他用完
hreading模块中定义了Lock类,可以方便的处理锁定:
1.创建锁
mutex = threading.Lock()
2.锁定
mutex.acquire([timeout])
3.释放
mutex.release()
其中,锁定方法acquire可以有一个超时时间的可选参数timeout。如果设定了timeout,则在超时后通过返回值可以判断是否得到了锁,从而可以进行一些其他的处理。
使用互斥锁实现上面的例子的代码如下:
from multiprocessing import Process,Lock
import time,random
#互斥锁:必须是lock.acquire()一次,然后lock.release()释放一次,才能继续lock.acquire()
#互斥锁和join区别
#大前提:二者的原理都是一样的,都是将并发变成串行,从而保证有序
#区别:join是按照认为指定的顺序执行,而互斥锁是所有的进程平等的竞争,谁先抢到谁执行
mutex=Lock()
#两个线程都在抢着对这个锁进行上锁,如果有一方成功上锁,那么导致另外一方会堵塞(一直等待),到这个锁被解开为之
thnum=0
class MyThread(threading.Thread):
def run(self):
mutex.acquire()
for i in range(10000):
global thnum
thnum+=1
print(thnum)
mutex.release()
def test():
global thnum
mutex.acquire() #等待可以上锁,通知而不是轮训,没有占用CPU
for i in range(10000):
thnum+=1
print(thnum)
mutex.release()#解锁
死锁概念
在多道程序系统中,由于多个进程的并发执行,改善了系统资源的利用率并提高了系统的处理能力。然而,多个进程的并发执行也带来了新的问题——死锁。所谓死锁是指多个进程因竞争资源而造成的一种僵局,若无外力作用,这些进程都将无法向前推进。
代码示意
from threading import Thread,Lock
import time
mutexA=Lock()
mutexB=Lock()
class MyThread(Thread):
def run(self):
self.func1()
self.func2()
def func1(self):
mutexA.acquire()
print('\033[41m%s 拿到A锁\033[0m' %self.name)
mutexB.acquire()
print('\033[42m%s 拿到B锁\033[0m' %self.name)
mutexB.release()
mutexA.release()
def func2(self):
mutexB.acquire()
print('\033[43m%s 拿到B锁\033[0m' %self.name)
time.sleep(2)
mutexA.acquire()
print('\033[44m%s 拿到A锁\033[0m' %self.name)
mutexA.release()
mutexB.release()
if __name__ == '__main__':
for i in range(5):
t=MyThread()
t.start()
-
python互斥锁问题_python——互斥锁的使用和分析
2021-02-09 21:32:45mutex = threading.Lock()定义一个全局的互斥锁对象,默认不加锁情况一:#!/usr/bin/python3# -*- coding: utf-8 -*-"""@author: zx coder@software: PyCharm@file: t5全局变量竞争资源.py@time: 2020/9/27 22:23""...mutex = threading.Lock()
定义一个全局的互斥锁对象,默认不加锁
情况一:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""
@author: zx coder
@software: PyCharm
@file: t5全局变量竞争资源.py
@time: 2020/9/27 22:23
"""
import threading
import time
g_num = 0
def test1(num):
global g_num
mutex.acquire()
for i in range(num):
g_num += num
mutex.release()
print("--------in test1 g_num = %d"%g_num)
def test2(num):
global g_num
mutex.acquire()
for i in range(num):
g_num += num
mutex.release()
print("--------in test2 g_num = %d" % g_num)
def main():
t1 = threading.Thread(target=test1, args=(1000000,))
t2 = threading.Thread(target=test2, args=(1000000,))
t1.start()
t2.start()
time.sleep(2)
print(f"--- main ---- g_num = {g_num}")
mutex = threading.Lock()
if __name__ == '__main__':
main()
out:
--------in test1 g_num = 1000000000000
--------in test2 g_num = 2000000000000
--- main ---- g_num = 2000000000000
再看,情况二:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""
@author: zx coder
@software: PyCharm
@file: t5全局变量竞争资源.py
@time: 2020/9/27 22:23
"""
import threading
import time
g_num = 0
def test1(num):
global g_num
for i in range(num):
mutex.acquire()
g_num += num
mutex.release()
print("--------in test1 g_num = %d"%g_num)
def test2(num):
global g_num
for i in range(num):
mutex.acquire()
g_num += num
mutex.release()
print("--------in test2 g_num = %d" % g_num)
def main():
t1 = threading.Thread(target=test1, args=(1000000,))
t2 = threading.Thread(target=test2, args=(1000000,))
t1.start()
t2.start()
time.sleep(2)
print(f"--- main ---- g_num = {g_num}")
mutex = threading.Lock()
if __name__ == '__main__':
main()
out:
--------in test2 g_num = 1894359000000
--------in test1 g_num = 2000000000000
--- main ---- g_num = 2000000000000
总结:
互斥锁使用原则:加锁的代码越少越好,对比之下,优先考虑用情况二
在情况二中,test2执行后的结果是随机的,数值大于一百万,小于两百万,为什么?因为,执行加1代码时,两线程共同抢CPU资源,谁抢到谁用。在test2执行一百万次中,test1也抢到很多,故而,全局变量g_num变成了在test2执行完的时间内两个线程共同作用的结果
-
mysql读写锁互斥_Mysql(MyISAM)的读写互斥锁问题的解决方法
2021-01-19 00:21:56Mysql(MyISAM)的读写互斥锁问题的解决方法更新时间:2011年09月27日 00:32:11 作者:最近因为数据库读的请求增加,出现了比较严重的读写锁问题,由于主从分离,主服务器很快的执行完了写入的操作,但从库由于有大量...Mysql(MyISAM)的读写互斥锁问题的解决方法
更新时间:2011年09月27日 00:32:11 作者:
最近因为数据库读的请求增加,出现了比较严重的读写锁问题,由于主从分离,主服务器很快的执行完了写入的操作,但从库由于有大量的select的查询,会被这些来自主辅同步的update,insert严重堵塞,最后造成所有的Mysql从库负载迅速上升。
由于没办法在短期内增加读的服务器,所以采取对Mysql进行了一些配置,以牺牲数据实时性为代价,来换取所有服务器的生命安全。呵呵,具体相关调整以及思路如下:
MyISAM在读操作占主导的情况下是很高效的。可一旦出现大量的读写并发,同InnoDB相比,MyISAM的效率就会直线下降,而且,MyISAM和 InnoDB的数据存储方式也有显著不同:通常,在MyISAM里,新数据会被附加到数据文件的结尾,可如果时常做一些UPDATE,DELETE操作之后,数据文件就不再是连续的,形象一点来说,就是数据文件里出现了很多洞洞,此时再插入新数据时,按缺省设置会先看这些洞洞的大小是否可以容纳下新数据,如果可以,则直接把新数据保存到洞洞里,反之,则把新数据保存到数据文件的结尾。之所以这样做是为了减少数据文件的大小,降低文件碎片的产生。但 InnoDB里则不是这样,在InnoDB里,由于主键是cluster的,所以,数据文件始终是按照主键排序的,如果使用自增ID做主键,则新数据始终是位于数据文件的结尾。
了解了这些基础知识,下面说说MyISAM几个容易忽视的配置选项:
concurrent_insert:
通常来说,在MyISAM里读写操作是串行的,但当对同一个表进行查询和插入操作时,为了降低锁竞争的频率,根据concurrent_insert的设置,MyISAM是可以并行处理查询和插入的:
当concurrent_insert=0时,不允许并发插入功能。
当concurrent_insert=1时,允许对没有洞洞的表使用并发插入,新数据位于数据文件结尾(缺省)。
当concurrent_insert=2时,不管表有没有洞洞,都允许在数据文件结尾并发插入。
这样看来,把concurrent_insert设置为2是很划算的,至于由此产生的文件碎片,可以定期使用OPTIMIZE TABLE语法优化。
max_write_lock_count:
缺省情况下,写操作的优先级要高于读操作的优先级,即便是先发送的读请求,后发送的写请求,此时也会优先处理写请求,然后再处理读请求。这就造成一个问题:一旦我发出若干个写请求,就会堵塞所有的读请求,直到写请求全都处理完,才有机会处理读请求。此时可以考虑使用max_write_lock_count:
max_write_lock_count=1
有了这样的设置,当系统处理一个写操作后,就会暂停写操作,给读操作执行的机会。
low-priority-updates:
我们还可以更干脆点,直接降低写操作的优先级,给读操作更高的优先级。
low-priority-updates=1
综合来看,concurrent_insert=2是绝对推荐的,至于max_write_lock_count=1和low-priority-updates=1,则视情况而定,如果可以降低写操作的优先级,则使用low-priority-updates=1,否则使用max_write_lock_count=1。
相关文章
格式化在我们日常开发中必不可少,最近在遇到了关于mysql格式化数字的需求,所以下面这篇文章主要给大家介绍了关于mysql中格式化数字的相关资料,分别介绍了format函数和rpad 和 lpad 给定位数,不足补充自定义字符,需要的朋友可以参考下。2017-07-07
这篇文章主要介绍了MySQL数据库优化之索引实现原理与用法,结合实例形式分析了mysql数据库优化操作的索引原理、具体实现与相关操作注意事项,需要的朋友可以参考下2020-01-01
mysql的默认编码是拉丁(latin1),当输入中文的时候就会报错,所以需要将编码修改为utf8,从网上找了相关教程都不可以,索性自己摸索后分享给大家,下面这篇文章主要给大家介绍了在mysql 5.7版本中如何修改编码为utf-8的方法步骤,需要的朋友可以参考下。2017-06-06
这篇文章主要介绍了详解MySQL中的存取权限,针对用户使用数据库权限分配的问题做出说明,需要的朋友可以参考下2015-07-07
最近更新网站发现一些字段的值不是预期的效果,需要替换下值,通过下面的sql语句,直接执行就可以了2012-06-06
移动端的表情或者一些emoji是4字节的,但是utf-8是3字节的,这篇文章主要介绍了设置mysql5.7编码集为utf8mb4的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2018-11-11
本文通过图文并茂的形式给大家介绍了mysql 8.0.11安装教程,非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下2019-04-04
这篇文章主要介绍了MySQL备份时排除指定数据库的方法的相关资料,需要的朋友可以参考下2016-03-03
这篇文章主要介绍了简单了解数据库方言dialect,数据库方言也是如此,MySQL 是一种方言,Oracle 也是一种方言,MSSQL 也是一种方言,他们之间在遵循 SQL 规范的前提下,都有各自的扩展特性,需要的朋友可以参考下2019-07-07
这篇文章主要为大家详细介绍了mysql出现提示错误10061的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-10-10
最新评论
-
python互斥锁问题_在Python中正确使用互斥锁
2020-12-11 13:20:38I am starting with multi-threads in python (or at least it is possible that my script creates multiple threads). would this algorithm be the right usage of a Mutex? I haven't tested this code yet and ... -
Mysql(MyISAM)的读写互斥锁问题的解决方法
2012-05-31 12:58:57此文档中详细记载了,Mysql(MyISAM)的读写互斥锁问题的解决方法,希望可以帮助到你! -
python3.7 互斥锁问题
2019-03-21 17:09:48#创建锁 t = threading.Thread(target=f1) t1 = threading.Thread(target=f2) t.start() t1.start() print(num) 结果:AttributeError: 'builtin_function_or_method' object has no attribute 'acquire... -
python中的GIL锁和互斥锁问题
2020-05-04 22:10:13互斥锁的引入 在明确问题前,我们应该知道在python中,线程是并发的而不是并行的,在平时不会有显现,但在资源调度上,这个问题就会特别明显,首先,我们通过一个例子来看一下资源竞争导致的问题: import ... -
linux多线程的互斥锁问题
2019-08-12 16:07:161、原因 ...2、多线程中的互斥锁 这是在源程序中看到的一个可疑的地方,简单来说就是,在将任务压到队列中的时候,需要去获取相应的锁(防止数据出现时间上的问题)但是问题是,该锁的初始化步骤还没有... -
python多线程互斥锁问题
2020-03-27 16:53:55之前一直觉得python的多线程有点问题,今天搞了一下多线程的事情;直接上代码了。 #-*- coding:utf8 -*- #!/usr/bin/env python import os import sys import subprocess import json import string import re ... -
mysql互斥 排他锁_Mysql(MyISAM)的读写互斥锁问题的解决方法
2021-02-02 04:35:50了解了这些基础知识,下面说说MyISAM几个容易忽视的配置选项: concurrent_insert: 通常来说,在MyISAM里读写操作是串行的,但当对同一个表进行查询和插入操作时,为了降低锁竞争的频率,根据concurrent_insert的... -
关于mStreamer.release();互斥锁问题
2020-12-26 04:58:15<div><p>在activity 中的 onDestroy()方法中调用了mStreamer.release();方法之后,finish()当前activity执行到mStreamer.release()方式时app就闪退了。报一下异常: libc: FORTIFY: pthread_mutex_... -
信号量 与 互斥锁问题
2015-12-22 15:53:11[img=https://img-bbs.csdn.net/upload/201512/22/1450770619_348226.png][/img] 请教 有时 1秒调 fun函数一百万次 会出现什么异常的问题吗?? -
线程6 多个互斥锁问题造成死锁
2019-03-03 16:19:13死锁概念 避免死锁 死锁概念 在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。...就会造成一个问题 线程1执行的时候锁A锁定,那么线程2卡在... -
python多线程共享全局变量及互斥锁问题解析
2019-10-19 10:09:46喜欢编程,热爱分享,希望能结交更多...有不懂的问题可以私聊我哦! #!/usr/bin/env python3# -*- coding: utf-8 -*- from threading import Thread num = 0 def addnum(): global num for i in range(1000): ... -
简单线程池中的互斥锁问题
2013-11-14 16:11:42/* 工作者线程函数, 从任务链表中取出任务并执行 */ 12: static void* 13: thread_routine(void *arg) 14: { 15: tpool_work_t *work;...在网上看到一段线程池代码,关于互斥锁这儿没搞懂 -
菜鸟一枚,互斥锁问题
2013-11-10 16:12:27//互斥锁 #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <string.h> void *fun(void *p); int main() { pthread_t pth = 0; pthread_mutex_t mutex;... -
线程池中的一个互斥锁问题
2013-11-14 16:28:1312: static void* 13: thread_routine(void *arg) 14: { 15: tpool_work_t *work; 16: ... 18: /* 如果线程池没有...互斥锁解锁后,其他并行的线程如果此时获得锁并修改了work的值,那么程序不是出问题了么?? -
多线程互斥锁问题(多线程模拟银行存取款)
2012-03-12 19:39:13通过以下代码可以看到互斥锁的重要性: #include #include #include static int totalmoney = 20000; //总金额20000 pthread_mutex_t mutex ; //定义变量 int Check_balance() { return ...
-
eclipse导入java模板下载_eclipse注释模板及格式化模板导入步骤
-
物联网基础篇:快速玩转MQTT
-
java spring例子_一个spring的简单例子
-
MHA 高可用 MySQL 架构与 Altas 读写分离
-
gui-elements:React应用程序的GUI元素-源码
-
深究字符编码的奥秘,与乱码说再见
-
SPFD5408A_V0.5_20070626.pdf
-
java spring 高并发_Java 架构师+高并发+性能优化+Spring boot大型分布式项目实战
-
onesaitplatform-ce-charts:Onesait Platform Helm图表-源码
-
尼斯:性感美女图片美女写真图片可颜可萌可撩人-源码
-
2021年 系统架构设计师 系列课
-
java spring 登录验证_详解使用Spring3 实现用户登录以及权限认证
-
DemoYoutubeLayoutSimple:演示版面youtube-源码
-
java spring 登录验证_springmvc-spring-mybatis实现最简单的登录验证
-
SPFD5408A_V0.1_20061020.pdf
-
基于python的dango框架购物商城毕业设计毕设源代码使用教程
-
SPFD5408A CPT 2.8 inch Application Note_20070706.pdf
-
java spring启动_java – Tomcat 7和Spring启动战争启动
-
MMM 集群部署实现 MySQL 高可用和读写分离
-
java spring上传文件到服务器_springboot实现上传图片到服务器,前端及java后台代码总结...