首页 > 其他分享 >锁+多线程

锁+多线程

时间:2023-10-14 16:24:28浏览次数:35  
标签:10 队列 线程 进程 操作 多线程

 

互斥锁mutex:保证共享数据操作的完整性,保证在任一时刻只能有一个线程访问对象。锁有两个操作。一个P操作(上锁),一个V操作(解锁)。P和V都是原子操作,就是在执行P和V操作时,不会被插队。锁一般

使用信号量来实现的,mutex其实就是信号量=1。互斥量就是同一时间能够分给一个人,即S=1。S=10表示可以将信号量分给10个人来用。如果一共有20个人那么只能有10个人用,剩下10个人需要等待。

-- 在本项目中有两个操作添加用户和删除用户,信息都是存在消息队列当中,如果不上锁,这两个操作同时执行可能导致在消息队列当中信息错乱。在本项目头文件中加入#include <mutex>引入互斥锁。

unique_lock<mutex> lck(message_queue.m); // 访问共享资源-消息队列,上锁 (函数结束会自动解锁,所以版本5.0,add_user()和remove_user()都没用到解锁)

lck.unlock(); // 访问消息队列结束,解锁(版本5.0中在consume_task死循环中用到,因为这个函数是死循环,不解锁可能一直循环出不了函数,导致无法正常自动解锁)

 

条件变量condition_variable:条件变量一般和互斥锁搭配使用,条件变量用于在多线程环境中等待特定事件发生。

-- 在本项目中如果消息队列为空则等待,如果有添加用户和删除用户的操作则将消息队列唤醒。

message_queue.cv.wait(lck) // 队列为空,等待(版本2.0用到)

message_queue.cv.notify_all();  // 出现有添加或删除用户的操作Task操作进队列,唤醒

 

提高程序的并发性:多线程、多进程

多线程消耗少一点,效率差不多

cpu把时间平均分成若干份,系统进行调度,每个线程都要抢时间片,抢到就运行态,否则处于就绪态,线程实际走走停停,看不出

linux下线程本质上是轻量级的进程

内存四区图:

栈区,堆区,数据区,代码区

细分:

 

 进程有自己独立的地址空间

 

如果是进程,就是多个线程共用一个地址空间

在一个地址空间中多个线程共享:代码区,堆区,全局数据区,打开的文件(文件描述符表)都是线程共享的

在一个地址空间中多个线程独享:每个线程都有属于自己的栈区,寄存器(内存中管理的)

 

线程是程序的最小执行单位,进程是操作系统中最小的资源分配单位

(1)每个进程应一个虚拟地址空间,一个进程只能抢一个CPU时间片

(2)一个地址空间中可以划分出多个线程,在有效的资源基础上,能够抢更多的CPU时间片(一个进程里的10个线程都能去抢cpu时间片)

 

CPU的调度和切换:线程的上下文切换比进程快的多

上下文切换:进程/线程分时复用CPU时间片,在切换之前会将上一个任务的状态进行保存,下次切换回这个任务的时候,加载这个状态继续运行

*** 任务从保存到再次加载这个过程就是一次上下文切换

 

标签:10,队列,线程,进程,操作,多线程
From: https://www.cnblogs.com/tkw123/p/17764299.html

相关文章

  • python多线程with方式加锁
    python多线程with方式加锁"""pythonTreading中的Lock模块提供了加锁和释放锁的方法,分别是acquire()和release().这两个方法可以搭配python的with语句使用."""#示例fromthreadingimportLock​temp_lock=Lock()​withtemp_lock: print(temp_lock) #输出是<locked......
  • 多线程逆向
    一.资料检索以及归纳XDBG调试时默认是只运行下断调试的线程其它线程处于暂停挂起状态属于单线程调试。打开线程窗口可以查看线程挂起计数(+号-号快捷键可以挂起恢复线程)双击线程可进入选择线程,如果要调试指定线程的话我的理解是应该在线程代码中下断(线程的各种系统CALL),线程会自......
  • C++ - 多线程之线程管理函数
    1.获取线程id函数get_id()的使用该函数在命名空间std::this_thread下。作用是获取当前线程的id。#include<iostream>#include<thread>usingnamespacestd;//No.1get_id()获取线程idvoidthreadFunc(){ cout<<"get_id()子线程id:"<<this_thread::get_id(......
  • C++ - 多线程之带返回值的线程处理函数
    1.使用async函数创建线程1.1使用步骤使用async函数启动一个异步任务(创建线程,并且执行线程处理函数),返回future对象通过future对象中get()方法获取线程处理函数的返回值1.2基本数据类型作为返回值#include<iostream>#include<thread>#include<future>using......
  • C++ - 多线程之线程同步
    1.多线程的并发问题线程间为什么需要同步?直接来看一个例子:inta=0;voidfoo(){ for(inti=0;i<10000000;++i) { a+=1; }}intmain(){ clock_tstart,end; start=clock(); threadt1(foo); threadt2(foo); t1.join(); t2.join(); end=clock();......
  • libuv多线程简单应用示范
     #include<stdio.h>#include<uv.h>//声明回调函数voidasyncCallback(uv_async_t*handle);voidclose_cb();voidthread_func_1(void*arg);voidthread_func_2(void*arg);//定时器回调函数voidtimer_callback(uv_timer_t*handle){//定时器触发后执......
  • linux 多线程写
      pread 和 pwrite 函数是linux下C语言编程中非常好用的IO操作函数。它们属于系统调用,在2.1.60之后版本的linux下都可以使用,尤其适合用于多线程的应用中,它们允许多个线程操作同一个文件描述符,不会互相影响彼此的文件偏移(offset)。 pread和pwrite函数所需......
  • 多线程分批处理数据(控制服务器cpu,控制数据库cpu)
    packageip;importcom.google.common.collect.Lists;importlombok.extern.slf4j.Slf4j;importjava.util.List;importjava.util.concurrent.CountDownLatch;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;/***功能描述:总思路,根据业务......
  • 多线程使用场景三-异步调用
         ......
  • 多线程使用场景二(数据汇总)
       ......