求推荐C++ 多线程编程经验方面的书籍

dxcheng116 2013-01-24 03:23:06
最近拜读《Effective C++》和《More Effective C++》感觉这类经验性的书籍写的很好,不过这两本书并没有涉及多线程编程方面的经验。
还请各位大侠推荐一本多线程编程经验的书籍,谢谢!
...全文
12376 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
besterector 2014-08-08
  • 打赏
  • 举报
回复
楼主想学习线程么? 我也是新手,因为项目需要学习了线程,学习的还算快。 总结了下学习过程,给楼主分享下: 1。 最最重要的,你想学习哪个系统的线程? 我学习的是windows 的多线程。 linux 和 windows 多线程概念差别很大的。 2。 先搞懂 什么是线程,线程同步的几种方法。 这些在网上搜搜资料, 有个大概认识即可。 3。 如果要熟练掌握,感觉应该看下 侯捷的《win32 多线程程序设计》。 上面会比较系统的讲解线程。 我大概看了一遍, 感觉很有收获。 4。 线程是内核对象, 如果楼主觉得 这本书深度还是不够,可以去看下 windows 核心编程。 上面会详细讲到 内核对象使用的方法和注意事项。 我是一开始读了这本书, 感觉非常吃力,基本没有能看懂的,后来看了win32 多线程程序设计, 再看这本书, 简单多了。 5。 一切 看书、 上网都是为了解决问题, 如果没有实践过程, 看书用处不大。
tixisong 2014-08-08
  • 打赏
  • 举报
回复
引用 3 楼 sublimepan 的回复:
基础教程 Win32多线程程序设计
侯杰的几本书都可以
ypzhong 2014-08-08
  • 打赏
  • 举报
回复
跨平台C++就用boost库。
weifeng0715 2014-08-07
  • 打赏
  • 举报
回复
电子版的网上可以下载撒
luotuo44 2014-08-07
  • 打赏
  • 举报
回复
C++ 11的多线程,与平台无关。书籍就《C++标准库:自学教程与参考手册(第2版)》
笨蛋糕 2013-11-08
  • 打赏
  • 举报
回复
引用 3 楼 sublimepan 的回复:
基础教程 Win32多线程程序设计
Win32多线程程序设计哪里可以买到?
笨蛋糕 2013-11-08
  • 打赏
  • 举报
回复
引用 25 楼 SKATE11 的回复:
《Win32多线程程序设计》《windows核心编程》都深入涉及到
在哪里可以买到win32多线程程序设计这本书?网上大部分都缺货了
denglfs 2013-10-04
  • 打赏
  • 举报
回复
引用
没有这个必要,c++11已经提供了一整套的工具(还缺thread pool,high level multithread algorithm) c++11的multithread相当优秀,C11的multithread也是根据c++11的标准和实现弄出来的 http://stackoverflow.com/questions/8876043/multi-threading-support-in-c11 The concurrency work for the new standards was done under the C++11 umbrella, then imported into C11 with the explicit goal of being compatible
这个说得很对的,有现成的当然直接用最好,我们没有必要重造车轮。自己封装仅仅为了练习,不适合正真的用。
SKATE11 2013-10-04
  • 打赏
  • 举报
回复
《Win32多线程程序设计》《windows核心编程》都深入涉及到
yangyijk 2013-10-04
  • 打赏
  • 举报
回复
win32多线程程序设计
stereoMatching 2013-10-03
  • 打赏
  • 举报
回复
引用 21 楼 dengliangfu 的回复:
多线程究用C 的就OK ,如果你非要用C++ 那么,就用C++ 把C封装下,封装程线程池什么的,这样也能提高C++的能力,《effective C++》也多讲关于封装的内容吧。
没有这个必要,c++11已经提供了一整套的工具(还缺thread pool,high level multithread algorithm) c++11的multithread相当优秀,C11的multithread也是根据c++11的标准和实现弄出来的 http://stackoverflow.com/questions/8876043/multi-threading-support-in-c11 The concurrency work for the new standards was done under the C++11 umbrella, then imported into C11 with the explicit goal of being compatible
denglfs 2013-10-03
  • 打赏
  • 举报
回复
多线程究用C 的就OK ,如果你非要用C++ 那么,就用C++ 把C封装下,封装程线程池什么的,这样也能提高C++的能力,《effective C++》也多讲关于封装的内容吧。
jdgdf566 2013-09-12
  • 打赏
  • 举报
回复
引用 13 楼 stereoMatching 的回复:
C++ concurrency in action 平台无关的C++11线程教程,对线程的概念讲解得非常好 从基础的线程,到multithread algorithms,atomic 进阶的memory model, future,promise等都有涉猎 书中有很多有用的例子 目前的编译器对c++11的线程支援不佳,楼主可以先用boost thread代替 除非你只打算在windows上发展 否则不用看什么win32多线程程序设计和windows核心编程 http://www.engcomputacaopucgo.com/arquivos/Materiais/Sistemas%20Operacionais/progconcCPP.pdf
赞同。 不过,windows上,要彻底发挥cpu的多线程的能力的话,看驱动程序接口吧。
dingqiang107 2013-01-30
  • 打赏
  • 举报
回复
引用 13 楼 stereoMatching 的回复:
C++ concurrency in action 平台无关的C++11线程教程,对线程的概念讲解得非常好 从基础的线程,到multithread algorithms,atomic 进阶的memory model, future,promise等都有涉猎 书中有很多有用的例子 目前的编译器对c++11的线程支援不佳,楼主可以先用boost thread代替……
这本书真不错。
赵4老师 2013-01-29
  • 打赏
  • 举报
回复
《30天自制操作系统》 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
wahaha_1986 2013-01-29
  • 打赏
  • 举报
回复
多线程这个东西和具体语言关系不大,应该和操作系统关系较大了,进程,线程都是系统在管理了。个人认为看楼主想在什么系统下学习了。
赵4老师 2013-01-29
  • 打赏
  • 举报
回复
仅供参考
//循环向a函数每次发送200个字节长度(这个是固定的)的buffer,
//a函数中需要将循环传进来的buffer,组成240字节(也是固定的)的新buffer进行处理,
//在处理的时候每次从新buffer中取两个字节打印
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <process.h>
#include <io.h>
//Log{
#define MAXLOGSIZE 20000000
#define MAXLINSIZE 16000
#include <time.h>
#include <sys/timeb.h>
#include <stdarg.h>
char logfilename1[]="MyLog1.log";
char logfilename2[]="MyLog2.log";
static char logstr[MAXLINSIZE+1];
char datestr[16];
char timestr[16];
char mss[4];
CRITICAL_SECTION cs_log;
FILE *flog;
void Lock(CRITICAL_SECTION *l) {
    EnterCriticalSection(l);
}
void Unlock(CRITICAL_SECTION *l) {
    LeaveCriticalSection(l);
}
void LogV(const char *pszFmt,va_list argp) {
    struct tm *now;
    struct timeb tb;

    if (NULL==pszFmt||0==pszFmt[0]) return;
    _vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);
    ftime(&tb);
    now=localtime(&tb.time);
    sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);
    sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );
    sprintf(mss,"%03d",tb.millitm);
    printf("%s %s.%s %s",datestr,timestr,mss,logstr);
    flog=fopen(logfilename1,"a");
    if (NULL!=flog) {
        fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);
        if (ftell(flog)>MAXLOGSIZE) {
            fclose(flog);
            if (rename(logfilename1,logfilename2)) {
                remove(logfilename2);
                rename(logfilename1,logfilename2);
            }
        } else {
            fclose(flog);
        }
    }
}
void Log(const char *pszFmt,...) {
    va_list argp;

    Lock(&cs_log);
    va_start(argp,pszFmt);
    LogV(pszFmt,argp);
    va_end(argp);
    Unlock(&cs_log);
}
//Log}
#define ASIZE    200
#define BSIZE    240
#define CSIZE      2
char Abuf[ASIZE];
char Cbuf[CSIZE];
CRITICAL_SECTION cs_HEX ;
CRITICAL_SECTION cs_BBB ;
struct FIFO_BUFFER {
    int  head;
    int  tail;
    int  size;
    char data[BSIZE];
} BBB;
int No_Loop=0;
void HexDump(int cn,char *buf,int len) {
    int i,j,k;
    char binstr[80];

    Lock(&cs_HEX);
    for (i=0;i<len;i++) {
        if (0==(i%16)) {
            sprintf(binstr,"%03d %04x -",cn,i);
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        } else if (15==(i%16)) {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
            sprintf(binstr,"%s  ",binstr);
            for (j=i-15;j<=i;j++) {
                sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
            }
            Log("%s\n",binstr);
        } else {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        }
    }
    if (0!=(i%16)) {
        k=16-(i%16);
        for (j=0;j<k;j++) {
            sprintf(binstr,"%s   ",binstr);
        }
        sprintf(binstr,"%s  ",binstr);
        k=16-k;
        for (j=i-k;j<i;j++) {
            sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
        }
        Log("%s\n",binstr);
    }
    Unlock(&cs_HEX);
}
int GetFromRBuf(int cn,CRITICAL_SECTION *cs,FIFO_BUFFER *fbuf,char *buf,int len) {
    int lent,len1,len2;

    lent=0;
    Lock(cs);
    if (fbuf->size>=len) {
        lent=len;
        if (fbuf->head+lent>BSIZE) {
            len1=BSIZE-fbuf->head;
            memcpy(buf     ,fbuf->data+fbuf->head,len1);
            len2=lent-len1;
            memcpy(buf+len1,fbuf->data           ,len2);
            fbuf->head=len2;
        } else {
            memcpy(buf     ,fbuf->data+fbuf->head,lent);
            fbuf->head+=lent;
        }
        fbuf->size-=lent;
    }
    Unlock(cs);
    return lent;
}
void thdB(void *pcn) {
    char        *recv_buf;
    int          recv_nbytes;
    int          cn;
    int          wc;
    int          pb;

    cn=(int)pcn;
    Log("%03d thdB              thread begin...\n",cn);
    while (1) {
        Sleep(10);
        recv_buf=(char *)Cbuf;
        recv_nbytes=CSIZE;
        wc=0;
        while (1) {
            pb=GetFromRBuf(cn,&cs_BBB,&BBB,recv_buf,recv_nbytes);
            if (pb) {
                Log("%03d recv %d bytes\n",cn,pb);
                HexDump(cn,recv_buf,pb);
                Sleep(1);
            } else {
                Sleep(1000);
            }
            if (No_Loop) break;//
            wc++;
            if (wc>3600) Log("%03d %d==wc>3600!\n",cn,wc);
        }
        if (No_Loop) break;//
    }
}
int PutToRBuf(int cn,CRITICAL_SECTION *cs,FIFO_BUFFER *fbuf,char *buf,int len) {
    int lent,len1,len2;

    Lock(cs);
    lent=len;
    if (fbuf->size+lent>BSIZE) {
        lent=BSIZE-fbuf->size;
    }
    if (fbuf->tail+lent>BSIZE) {
        len1=BSIZE-fbuf->tail;
        memcpy(fbuf->data+fbuf->tail,buf     ,len1);
        len2=lent-len1;
        memcpy(fbuf->data           ,buf+len1,len2);
        fbuf->tail=len2;
    } else {
        memcpy(fbuf->data+fbuf->tail,buf     ,lent);
        fbuf->tail+=lent;
    }
    fbuf->size+=lent;
    Unlock(cs);
    return lent;
}
void thdA(void *pcn) {
    char        *send_buf;
    int          send_nbytes;
    int          cn;
    int          wc;
    int           a;
    int          pa;

    cn=(int)pcn;
    Log("%03d thdA              thread begin...\n",cn);
    a=0;
    while (1) {
        Sleep(100);
        memset(Abuf,a,ASIZE);
        a=(a+1)%256;
        if (16==a) {No_Loop=1;break;}//去掉这句可以让程序一直循环直到按Ctrl+C或Ctrl+Break或当前目录下存在文件No_Loop
        send_buf=(char *)Abuf;
        send_nbytes=ASIZE;
        Log("%03d sending %d bytes\n",cn,send_nbytes);
        HexDump(cn,send_buf,send_nbytes);
        wc=0;
        while (1) {
            pa=PutToRBuf(cn,&cs_BBB,&BBB,send_buf,send_nbytes);
            Log("%03d sent %d bytes\n",cn,pa);
            HexDump(cn,send_buf,pa);
            send_buf+=pa;
            send_nbytes-=pa;
            if (send_nbytes<=0) break;//
            Sleep(1000);
            if (No_Loop) break;//
            wc++;
            if (wc>3600) Log("%03d %d==wc>3600!\n",cn,wc);
        }
        if (No_Loop) break;//
    }
}
int main() {
    InitializeCriticalSection(&cs_log );
    Log("Start===========================================================\n");
    InitializeCriticalSection(&cs_HEX );
    InitializeCriticalSection(&cs_BBB );

    BBB.head=0;
    BBB.tail=0;
    BBB.size=0;

    _beginthread((void(__cdecl *)(void *))thdA,0,(void *)1);
    _beginthread((void(__cdecl *)(void *))thdB,0,(void *)2);

    if (!access("No_Loop",0)) {
        remove("No_Loop");
        if (!access("No_Loop",0)) {
            No_Loop=1;
        }
    }
    while (1) {
        Sleep(1000);
        if (No_Loop) break;//
        if (!access("No_Loop",0)) {
            No_Loop=1;
        }
    }
    Sleep(3000);
    DeleteCriticalSection(&cs_BBB );
    DeleteCriticalSection(&cs_HEX );
    Log("End=============================================================\n");
    DeleteCriticalSection(&cs_log );
    return 0;
}
MaggieLin 2013-01-29
  • 打赏
  • 举报
回复
dxcheng116 2013-01-28
  • 打赏
  • 举报
回复
引用 13 楼 stereoMatching 的回复:
C++ concurrency in action 平台无关的C++11线程教程,对线程的概念讲解得非常好 从基础的线程,到multithread algorithms,atomic 进阶的memory model, future,promise等都有涉猎 书中有很多有用的例子 目前的编译器对c++11的线程支援不佳,楼主可以先用boost thread代替 除非你只打算在wind……
如你所说,我这里就是想与平台无关的关于线程的实践经验教程,boost库也看过一部分,代码有些晦涩,呵呵。。。
stereoMatching 2013-01-25
  • 打赏
  • 举报
回复
C++ concurrency in action 平台无关的C++11线程教程,对线程的概念讲解得非常好 从基础的线程,到multithread algorithms,atomic 进阶的memory model, future,promise等都有涉猎 书中有很多有用的例子 目前的编译器对c++11的线程支援不佳,楼主可以先用boost thread代替 除非你只打算在windows上发展 否则不用看什么win32多线程程序设计和windows核心编程 http://www.engcomputacaopucgo.com/arquivos/Materiais/Sistemas%20Operacionais/progconcCPP.pdf
加载更多回复(12)
本课程是C++零基础入门课程,一共19个大章节,课件内容大概10万字,会尽量详细系统的把C++讲清楚,由于C++有一部分知识点和C语言重合,本课程也附带讲解C语言的知识点,学习本课程是同时掌握两门语言,前10章是C和C++的共同部分,如果出现二者的区别会分开讲解。本课程不会盲目的讲解C++语法,将会和Google开源C++项目WebRTC结合,介绍C++在实际项目中的应用,在部分章节会提供相应的算法题目巩固本章节的内容。除了C++的学习,本课程会提供一些软件开发的经验、方法,让大家少走一些弯路。C++虽然难学,但是也不是学不会,掌握好了C++,学习其它语言将会更轻松、愉快。课程章节内容概述第1、2、3、4、5章节作为C/C++基础,主要以理解为主,可以花费较少的时间;第6~~10章节讲解指针、内存管理、函数,需要多理解练习;第11章是C++的核心,类与对象;第12章,讲解C++的精华部分模板元编程;第13章节讲解C++的智能指针,这是C++程序设计的重要技术,需要多理解、练习;第14章C++标准库,以应用为主会稍微简单些;第15章介绍C++新标准中比较实用的知识点,会比较难,不好理解,需要勤加练习;第16章文件读写以练习为主,较简单;第17章多线程以理解练习为主,可以参考开源项目学习、应用。第18、19章主要是C++领域介绍,职业选择,C++学习方法推荐。第1章是C/C++历史、版本介绍、C++难点痛点分析、学习网站推荐书籍推荐。第2章介绍C++开发环境搭建以及项目构建方法,调试方法,这是C++学习的第一步,是很关键的一步;本章主要介绍三种开发环境的安装与项目构建方法: (1)Windows Visual Studio C++ 开发环境; (2)Virtual Box虚拟机ubuntu C++ vscode ssh开发环境; (3)Windows WSL : windows linux子系统。课程会同时介绍在windows和linux下的C++开发,windows以vs2022为开发环境,linux以ubuntu vscode ssh gcc g++为代码编写环境。第3章是C++入门知识点讲解,数据类型,变量、输入输出、运算符等,该部分以理解记忆为主,可以快速学完。第4章讲解循环控制,if、for、while、do while、go。第5章是数组,讲解一维数组,二维数组,并提供了一些练习题,供学习巩固。第6章是指针与引用,该部分是C/C++学习的难点,也是众多C/C++程序员的噩梦,指针与引用内容是函数的基础,因此提到前面来。第7章讲解字符串,字符串是一个很复杂的数据类型,在C++中更是复杂,由于C++应用范围广,几乎每个C++框架都有自己的字符串实现方式,C++的字符串因此至少有十多种表现方式,因此我考虑把字符串作为单独章节,让大家在以后的开发中增加对字符串的理解。第8章是内存分配,独立分配释放内存,也是C/C++区别其它语言的地方,程序员可以直接操作内存,但同时也为程序的编写带来了难度,内存管理不好,很容易出现程序无法商用的情况。除了基础的内存分配,本章节也会介绍内存池,为编写高性能C++程序打基础。第9章讲解函数,有了前面八章的铺垫,编程中的重要成员函数出现了,这一章的内容会稍微难些,要注意理解、练习,章节的最后提供了练习题,供学习巩固。第10章介绍结构体,在C语言中,结构体应用很广泛,这也是C语言结束的章节。第11章类与对象是C++的核心,本章的知识会比较多,会详细介绍类的各个知识点,名字空间、函数重载、构造函数、析构函数、深拷贝、浅拷贝、静态函数、继承、虚函数、多态、友元函数、友元类、运算符重载、类内存分析等等。第12章是模板元编程C++最难的内容,也是写C++高性能程序的必经之路,模板元编程也是后面智能指针、标准库STL、多线程的基础。第13章讲解智能指针,会由浅入深的讲解内存分配释放与智能指针的关系,会全面介绍C++智能指针的应用。一个好的C++项目,基本是看不见new与delete,该章节会介绍一部分webrtc中的代码,看看优秀的C++项目是怎么写C++。第14章是C++标准库,学习C++编程中常用的工具类与算法组件,章节最后也提供了一些算法练习题,需要用到标准库的一些组件类。第15章讲解C++新标准的一些实用的知识点,该部分知识在实际项目中会用的比较多,也是不太好理解的部分。第16章介绍文件操作,先介绍文件操作的一些基本函数,然后介绍json, xml文件的操作方法。第17章是多线程,介绍C++ 11多线程、线程池的用法。第18章介绍C++开发的相关领域,是很重要的章节,也是以后工作的参考。第19章课程总结,以及后续学习指导。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧