C++11多线程04

死锁

#include <iostream>
#include <thread>
#include <mutex>
#include <fstream>

class LofFile
{
public:

    void shared_print(std::string name , int num)
    {
        std::lock_guard<std::mutex> locker(m_mutex) ;
        std::lock_guard<std::mutex> locker2(m_mutex2) ;
        std::cout<<name<<": "<<num<<std::endl;
    }
    void shared_print2(std::string name , int num)
    {
        std::lock_guard<std::mutex> locker2(m_mutex2) ;
        std::lock_guard<std::mutex> locker(m_mutex) ;

        std::cout<<name<<": "<<num<<std::endl;
    }
private:
    std::mutex m_mutex ;
    std::mutex m_mutex2 ;
};

void thread_fun(LofFile& log)
{
    for(int i = 0 ; i>-100 ;i--)
    {
        log.shared_print("子线程",i);
    }
}

int main()
{
    LofFile log ;

    std::thread t(thread_fun,std::ref(log));

    for(int i=0 ;i<100;i++)
    {
        log.shared_print2("主线程",i);
    }

    t.join();

    return 0;
}

解决死锁方法1:使mutex顺序相同

#include <iostream>
#include <thread>
#include <mutex>
#include <fstream>

class LofFile
{
public:

    void shared_print(std::string name , int num)
    {
        std::lock_guard<std::mutex> locker(m_mutex) ;
        std::lock_guard<std::mutex> locker2(m_mutex2) ;
        std::cout<<name<<": "<<num<<std::endl;
    }
    void shared_print2(std::string name , int num)
    {

        std::lock_guard<std::mutex> locker(m_mutex) ;
        std::lock_guard<std::mutex> locker2(m_mutex2) ;
        std::cout<<name<<": "<<num<<std::endl;
    }
private:
    std::mutex m_mutex ;
    std::mutex m_mutex2 ;
};

void thread_fun(LofFile& log)
{
    for(int i = 0 ; i>-100 ;i--)
    {
        log.shared_print("子线程",i);
    }
}

int main()
{
    LofFile log ;

    std::thread t(thread_fun,std::ref(log));

    for(int i=0 ;i<100;i++)
    {
        log.shared_print2("主线程",i);
    }

    t.join();

    return 0;
}

解决死锁方法2:使用std::lock

#include <iostream>
#include <thread>
#include <mutex>
#include <fstream>

class LofFile
{
public:

    void shared_print(std::string name , int num)
    {
        std::lock(m_mutex,m_mutex2);
        std::lock_guard<std::mutex> locker(m_mutex,std::adopt_lock) ;
        std::lock_guard<std::mutex> locker2(m_mutex2,std::adopt_lock) ;
        std::cout<<name<<": "<<num<<std::endl;
    }
    void shared_print2(std::string name , int num)
    {
        std::lock(m_mutex,m_mutex2);
        std::lock_guard<std::mutex> locker2(m_mutex2,std::adopt_lock) ;
        std::lock_guard<std::mutex> locker(m_mutex,std::adopt_lock) ;

        std::cout<<name<<": "<<num<<std::endl;
    }
private:
    std::mutex m_mutex ;
    std::mutex m_mutex2 ;
};

void thread_fun(LofFile& log)
{
    for(int i = 0 ; i>-100 ;i--)
    {
        log.shared_print("子线程",i);
    }
}

int main()
{
    LofFile log ;

    std::thread t(thread_fun,std::ref(log));

    for(int i=0 ;i<100;i++)
    {
        log.shared_print2("主线程",i);
    }

    t.join();

    return 0;
}

时间: 2024-10-06 20:37:12

C++11多线程04的相关文章

C++11多线程教学(二)

转载自:http://www.cnblogs.com/lidabo/p/3908713.html C++11多线程教学II 从我最近 发布的C++11线程教学文章里,我们已经知道C++11线程写法与POSIX的pthreads写法相比,更为简洁.只需很少几个简单概念,我们就能搭 建相当复杂的处理图片程序,但是我们回避了线程同步的议题.在接下来的部分,我们将进入C++11多线程编程的同步领域,看看如何来同步一组并行的线程. 我们快速回顾一下如何利用c++11创建线程组.上次教学当中,我们用传统c数

C++11多线程教学(一)

转载自:http://www.cnblogs.com/lidabo/p/3908705.html 本篇教学代码可在GitHub获得:https://github.com/sol-prog/threads. 在之前的教学中,我展示了一些最新进的C++11语言内容: 1. 正则表达式(http://solarianprogrammer.com/2011/10/12/cpp-11-regex-tutorial/) 2. raw string(http://solarianprogrammer.com/

C++11多线程编程之互斥量

+(UIImage*)createImageFromView:(UIView*)view { //obtain scale CGFloat scale = [UIScreen mainScreen].scale; 开始绘图,下面方法,第一个参数表示区域大小.第二个参数表示是否是非透明的.如果需要显示半透明效果,需要传NO,否则传YES.第三个参数就是屏幕密度了 UIGraphicsBeginImageContextWithOptions(CGSizeMake(view.frame.size.wi

C++11 多线程

C++11开始支持多线程编程,之前多线程编程都需要系统的支持,在不同的系统下创建线程需要不同的API如pthread_create(),Createthread(),beginthread()等,使用起来都比较复杂,C++11提供了新头文件<thread>.<mutex>.<atomic>.<future>等用于支持多线程. 使用C++11开启一个线程是比较简单的,下面来看一个简单的例子: #include <thread> #include &

Linux下c++11多线程聊天室

刚看的c++11多线程,写个聊天室试试编译的时候加上 c++11 和 多线程库g++ -Wall -std=c++0x -pthread -o server server.cppserver 和client 都是 q 退出?1. [代码]server.cpp #include <iostream>#include <thread>#include <arpa/inet.h>#include <cstring>#include <vector>#i

c++11 多线程 -- 基本使用

c++11 多线程 – 基本使用 前言:这篇文章仅针对没有使用过c++11线程库的童鞋来快速入门,也是自己的一个简单记录,内容比较基础. -1.线程的基本使用 -2.互斥量 -3.条件变量 -4.原子变量 1.线程的基本使用 代码: #include <stdio.h> #include <stdlib.h> #include <assert.h> #include <thread> #include <iostream> int k = 0;

C++11 并发指南一(C++11 多线程初探)(转)

引言 C++11 自2011年发布以来已经快两年了,之前一直没怎么关注,直到最近几个月才看了一些 C++11 的新特性,今后几篇博客我都会写一些关于 C++11 的特性,算是记录一下自己学到的东西吧,和大家共勉. 相信 Linux 程序员都用过 Pthread, 但有了 C++11 的 std::thread 以后,你可以在语言层面编写多线程程序了,直接的好处就是多线程程序的可移植性得到了很大的提高,所以作为一名 C++ 程序员,熟悉 C++11 的多线程编程方式还是很有益处的. 如果你对 C+

DirectX* 11 多线程渲染的性能、方法和实践

对于在 CPU 上运行的 PC 游戏,渲染通常是主要的性能瓶颈:多线程渲染是一种消除瓶颈的有效方法.本文研究了 DirectX* 11 多线程渲染的性能可扩展性,讨论了多线程渲染的两种基本方法,并介绍了传统多线程延迟着色管线在大型在线游戏<战意*>中的应用.了解更多 原文地址:https://www.cnblogs.com/IDZPRC/p/10912669.html

11.多线程&amp;&amp;并发

11.1 操作系统中线程和进程的概念 一些常见的概念: 程序:指令和数据的byte序列,eg:qq.exe;a2. 进程:正在运行的程序(如QQ);a3.一个进程中可能有一到多个线程. 线程的概念:Thread 每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程.进程也可能是整个程序或者是部分程序的动态执行.线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行.也可以把它理解为代码运行的上下文.所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务.通常由操作系统负责