精华内容
下载资源
问答
  • 若使用mutex.lock()方法时std::cout出现异常,则会导致mutex无法释放。改用std::lock_guard可有效避免该情况发生。#include #include #include #include using namespace std;...// 对资源加锁 /// 用lock若c

    若使用mutex.lock()方法时std::cout出现异常,则会导致mutex无法释放。改用std::lock_guard可有效避免该情况发生。

    #include <iostream>
    #include <thread>
    #include <string>
    #include <mutex>
    using namespace std;
    
    std::mutex mu;
    
    // 对资源加锁
    /// 用lock若cout抛出异常则mu永远不会被释放
    /// 用lock_guard析构时自动释放
    void shared_print(std::string msg, int id) {
           std::lock_guard<std::mutex> guard(mu); // 较好的方法
           //mu.lock(); // 较差的方法
           std::cout << msg << id << std::endl;
           //mu.unlock();
    }
    
    void func_1() {
           for (int i = 0; i > -100; --i) {
                  shared_print("from func_1 ", i);
           }
    }
    
    class Fctor {
    public:
           void operator()(string& s) {
                  for (int i = 0; i > -10; --i) {
                         std::cout << "from t1: " << s << std::endl;
                  }
                  s = "factor";
           }
    };
    
    int main() {
           std::thread t1(func_1);
    
           for (int i = 0; i < 100; ++i) {
                  shared_print("from main ", i);
           }
    
           t1.join();
           return 0;
    }
    
    展开全文
  • 因为需要些多线程的C++爬虫 之前弄得多线程没有使用互斥,然后出现一些问题就是,重复下载了网页......网上查了下 发现这块代码不多 所以我写个博客 分享给需要的人 编译环境VS2013+WIN8.1 或者codeblocks +win8.1 ...

    因为需要些多线程的C++爬虫 之前弄得多线程没有使用互斥,然后出现一些问题就是,重复下载了网页......网上查了下  发现这块代码不多  所以我写个博客 分享给需要的人

    编译环境VS2013+WIN8.1 或者codeblocks +win8.1  下面的代码是codeblocks下的,变化一处就可以放vs  见注释

    代码参考了这里:http://bbs.csdn.net/topics/370051110

    // MulThread.cpp : 定义控制台应用程序的入口点。
    //
    
    
    #include <iostream>
    #include <windows.h>
    #include <process.h>
    #include <fstream>
    #include <stdlib.h>
    #include <cstdio>
    using namespace std;
    
    
    DWORD WINAPI Fun1Proc(
    	LPVOID lpParameter   // thread data
    	);
    
    DWORD WINAPI Fun2Proc(
    	LPVOID lpParameter   // thread data
    	);
    int index = 0;
    int tickets = 100;
    HANDLE hMutex;
    int main()
    {
    	HANDLE hThread1;
    	HANDLE hThread2;
    	hThread1 = CreateThread(NULL, 0, Fun1Proc, NULL, 0, NULL);
    	hThread2 = CreateThread(NULL, 0, Fun2Proc, NULL, 0, NULL);
    	CloseHandle(hThread1);
    	CloseHandle(hThread2);
    
    	//    hMutex=CreateMutex(NULL,TRUE,NULL);
    	hMutex = CreateMutex(NULL, TRUE, "queue");//如果是VS2013 hMutex = CreateMutex(NULL, TRUE, L"queue");
    	if (hMutex)
    	{
    		if (ERROR_ALREADY_EXISTS == GetLastError())
    		{
    			cout << "only one instance can run!" << endl;
    			return 0;
    		}
    	}
    	WaitForSingleObject(hMutex, INFINITE);
    	ReleaseMutex(hMutex);
    	ReleaseMutex(hMutex);
    
    	//Sleep(4000);
    	system("pause");
    	return 0;
    }
    
    DWORD WINAPI Fun1Proc(
    	LPVOID lpParameter   // thread data
    	)
    {
    	   while(TRUE)
    	{
            WaitForSingleObject(hMutex,INFINITE);
            if(tickets>0)
            {
            Sleep(1);
            cout<<"thread1 sell ticket : "<<tickets--<<endl;
            }
            else
            break;
            ReleaseMutex(hMutex);
    	}
    	return 0;
    }
    
    DWORD WINAPI Fun2Proc(
    	LPVOID lpParameter   // thread data
    	)
    {
        while(TRUE)
    	{
            WaitForSingleObject(hMutex,INFINITE);
            if(tickets>0)
            {
            Sleep(1);
            cout<<"thread2 sell ticket : "<<tickets--<<endl;
            }
            else
            break;
            ReleaseMutex(hMutex);
    	}
    	return 0;
    }
    


    展开全文
  • 假如有一资源 ra 对应着锁ca,有线程 ta, tb ,tc对其访问,一般会对ra加锁实现互斥访问。但若再有资源 rb(锁cb), rc(锁cc) ,rd(锁cd),而在线程ta中假如出现 ca cb ra rb cb ca, 而在另一线程中出现 cb ca ...

    假如有一资源 ra 对应着锁ca,有线程 ta, tb ,tc对其访问,一般会对ra加锁实现互斥访问。但若再有资源 rb(锁cb), rc(锁cc) ,rd(锁cd),而在线程ta中假如出现  ca cb ra rb cb ca, 而在另一线程中出现 cb ca ra rb ca cb,势必出现锁死的现象。

     

    方案一:把ra rb归为一个资源,

    展开全文
  • #include #include int tickets=100;DWORD WINAPI fun1Proc(LPVOID lpParameter);DWORD WINAPI fun2Proc(LPVOID lpParameter);//创建一个临界区CRITICAL_SECTION g_cs;int main(){ HANDLE hThread1,...
     
    1. #include <windows.h>
    2. #include <iostream>
    3. int tickets=100;
    4. DWORD WINAPI fun1Proc(LPVOID lpParameter);
    5. DWORD WINAPI fun2Proc(LPVOID lpParameter);
    6. //创建一个临界区
    7. CRITICAL_SECTION g_cs;
    8. int main()
    9. {
    10.     HANDLE hThread1,hThread2;
    11.     
    12.     //初始化临界区
    13.     InitializeCriticalSection(&g_cs);
    14.     hThread1 = CreateThread(NULL,0,fun1Proc,NULL,0,NULL);
    15.     hThread2 = CreateThread(NULL,0,fun2Proc,NULL,0,NULL);
    16.     
    17.     CloseHandle(hThread1);
    18.     CloseHandle(hThread2);
    19.     
    20.     Sleep(4000);
    21.     DeleteCriticalSection(&g_cs);
    22.     return 0;
    23. }
    24. DWORD WINAPI fun1Proc(LPVOID lpParameter)
    25. {
    26.     while(true)
    27.     {
    28.         //进入临界区
    29.         EnterCriticalSection(&g_cs);
    30.         if(tickets)
    31.         {
    32.             
    33.             std::cout<<"Thread1 selled ticket "<<tickets--<<std::endl;
    34.         }
    35.         else
    36.         {
    37.             break;
    38.         }
    39.         //离开临界区
    40.         LeaveCriticalSection(&g_cs);
    41.     }
    42.     return 0;
    43. }
    44. DWORD WINAPI fun2Proc(LPVOID lpParameter)
    45. {
    46.     while(true)
    47.     {
    48.         EnterCriticalSection(&g_cs);
    49.         if(tickets)
    50.         {
    51.         
    52.             std::cout<<"Thread2 selled ticket "<<tickets--<<std::endl;
    53.         }
    54.         else
    55.         {
    56.             break;
    57.         }
    58.         LeaveCriticalSection(&g_cs);
    59.     }
    60.     return 0;
    61. }
    展开全文
  • [img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/onion/4.gif][/img]
  • 解决死锁问题,也就是旧进程资源不释放,新进程得不到资源。 什么是银行家算法 银行家就理解成放贷的人,放贷的人,是需要通过放贷赚钱的,所以他必须准确的把握放出去的钱能不能收回来,因为众所周知,有很多老赖,...
  • 文章目录1 定时器的资源互斥处理1.1 问题1.2 解决方案 1 定时器的资源互斥处理 1.1 问题 在定时器处理函数中,是否可以随意访问系统中的资源? 1.2 解决方案 定时器工作原理: 参考资料: 手把手教你学用...
  • 问题描述:现有一个主线程main,一个子线程online,online线程在启动后,如果没有互斥信号变量,会一直占用某个共享资源-比如串口。当主线程中有需要访问串口资源的时候,需要等待子线程执行完一个串口读写后释放互斥...
  • 互斥量(mutex)从本质上来说是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。对互斥量进行加锁后,任何其他试图再次对互斥量加锁的线程将会被阻塞直到当前线程释放该互斥锁。如果释放...
  • 互斥锁: 为资源引入一个状态,锁定/非锁定 当多个线程几乎同时修改一个共享数据时,需要进行同步控制 线程同步能够保证多个线程安全访问竞争资源,最简单的同步机制是引入互斥锁 某个线程要更改共享数据时,现将其...
  • 多线程共享资源互斥

    2018-10-08 22:07:46
    同学问了16年联考第30题,关于这个互斥的问题,查了一下,整理一下. 主要是多线程共享变量互斥的问题,怎么说呢,最后得出的结论是虽然是多线程操作,但是赋值和运算还不是一起的,所以需要建立互斥关系. 但是这个结论是在...
  • 进程互斥 进程互斥:在多个程序中,有两个进程不可以同时进行(例如读,写操作)。...如果操作系统将资源分配给其中的某一个进程使用,另一个进程就必须等待,直到申请的资源可用时,由操作系统分配给他们。 ...
  • 进程间互斥访问临界资源

    千次阅读 2019-07-11 03:42:37
    进程间互斥访问临界资源 1、使用临界区变量 HANDL g_hMutex; HANDLE g_hThread[2]; main() { g_hMutex=CreateMutex(NULL,FALSE,NULL); g_hThread[0]=CreateThread(..); g_hThread[1]=CreateThread(..); } ...
  • 临界资源与临界区 临界资源(critical resource):一次只能供一个...为了实现临界资源互斥访问,只要做到进程互斥地进去自己的临界区,便可以实现进程对临界资源互斥访问。 同步机制 为实现各进程互质地访...
  • java多线程资源互斥访问

    千次阅读 2017-03-08 19:48:50
    java多线程——资源互斥访问 本文首先介绍一下java实现多线程的几种方式,再介绍一下如何实现资源互斥访问,最后介绍生产环境中线程池的应用。 好,下面上货。 一、创建线程的两种方式: 1、继承Thread类。 ...
  • 进程互斥和进程同步

    千次阅读 2018-05-27 22:40:27
    系统中某些资源一次只允许一个进程使用,称这样的资源为临界资源(或互斥资源)。 2.临界区(互斥区)(critical section(region)):各个进程中对某个临界资源(互斥资源)实施操作的程序片段。 3.进程互斥(mutual ...
  • 进程互斥和同步

    2019-09-04 15:17:42
    一、进程 进程互斥(mutual exclusion) 共享资源 是竞争关系。 是无意识安排的,可以发生在相关进程之间,也...系统中某些资源只允许一个进程使用,这样的资源称为临界资源(critical resource),或互斥资源又...
  • 通过对mutex的使用,达到进程内多个线程的互斥访问临界资源
  • 在多任务环境下,往往存在多个任务竞争同一共享资源的应用场景,互斥锁可被用于对共享资源的保护从而实现独占式访问。互斥锁(mutex)又称互斥型信号量,是一种特殊的二值信号量,用于实现对共享资源的独占式处理。...
  • 进程间同步和互斥:临界资源

    千次阅读 2016-03-20 18:34:25
    各进程采取互斥的方式,实现共享的资源称作临界资源。 属于临界资源的硬件有打印机、磁带机等,软件有消息缓冲队列、变量、数组、缓冲区等。 诸进程间应采取互斥方式,实现对这种资源的共享。 每个进程中访问...
  • 进程同步与互斥

    千次阅读 2017-04-09 14:21:21
    临界资源:系统中某些资源一次只允许一个进程使用,这样的资源称为临界资源或互斥资源或共享资源临界区:各个进程中对某个临界资源实施操作的程序片段。临界区使用原则: 没有进程在临界区时,想进入临界区的进程可...
  • 进程的同步与互斥

    2019-04-22 19:56:13
    系统中的某些资源一次只允许一个进程使用的资源临界资源称之为临界资源或者互斥资源共享资源。各进程采取互斥的方式,实现共享的资源称作临界资源。属于临界资源的硬件有,打印机,磁带机等;软件有消息队列,变量,...
  • 一直不是很搞的清楚线程同步与资源互斥,不过好像这两个也是一个统一的内容。 1.创建线程 线程同步首先要有多线程为前提,如何创建线程:CreateThread函数(如果下文不需要引用句柄,可以提前关闭) 2.互斥对象...
  • 内容: 分布式系统中,临界资源需要保证互斥的进行访问,否则结果会错乱 分布式系统中,对资源进行互斥方式访问的方法: 1、集中式互斥 2、分布式互斥 3、令牌式互斥 互斥方法一:集中式互斥: 原理: 引入中央...
  • QT多线程临界资源互斥

    千次阅读 2017-11-28 19:41:48
    多线程是个老梗,一般都会遇到,同样临界资源互斥访问也是一个老生长谈的问题了。这里把最近使用的一种方法分享一下。 问题场景:主线程根据一定条件创建多个子线程,子线程执行的是同一个类不同实例的方法,该...
  • 同步与互斥 锁(Mutex) 读写锁(RWMutex) 信号量(Semaphore) 等待组(WaitGroup) 条件变量(Cond) 资源共享 文件系统 剪贴板 通讯 网络。 很重要的一个事实是: 这些进程同在一台机器上,同在一个局域网中 .....
  • 详细参考互斥量野火教程。...例如线程A获得了互斥量,线程A在未释放前可以继续嵌套获取互斥量,但是只有释放嵌套次数,才算真正释放互斥资源。 示例中的join只是提供线程全部退出的时机,为销毁互斥量做准备。 ...
  • 浅析Redis实现lock互斥访问资源

    千次阅读 2015-01-01 18:00:32
    在高并发的应用中,很多时候我们需要对某些资源进行竞争访问,比如在很多人下载一个热门资源,就可能存在很多请求去修改某个资源的peer信息(就是保存了当前保种人的ip地址和端口号),需要保证某个请求修改peer信息...
  • 在操作系统领域资源的同步和互斥是一个很重要的研究课题,由于多线程应用多数情况下都是需要相互交流信息,并且时常会出现同时操作同一个数据源的情况,为了解决这样的并发问题,我们需要控制资源的同步和互斥.

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,960
精华内容 6,384
关键字:

互斥资源