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

dxcheng116 2013-01-24 03:23:06
最近拜读《Effective C++》和《More Effective C++》感觉这类经验性的书籍写的很好,不过这两本书并没有涉及多线程编程方面的经验。
还请各位大侠推荐一本多线程编程经验的书籍,谢谢!
...全文
12504 32 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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)

65,186

社区成员

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

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