栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++11多线程与信号量

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++11多线程与信号量

目录

最终目标:

纯线程无信号量

打印结果:

加入信号量同步

输出:

CMakeLists.txt

编译运行


最终目标:

1. c++类,创建3个线程,基类每隔1秒钟生产一个信号量,2个子类,消费信号量,达到同步效果

2. 以成员函数为线程

3. 基类创建线程,子类继承创建方法,重写线程函数

4. 3个线程修改全局变量g_nCount

纯线程无信号量
#include 
#include 
#include 

int g_nCount = 0;
class CBaseWorker
{
public:
    CBaseWorker(){}
    virtual ~CBaseWorker(){}

    void startJob()
    {
        m_bRunning = true;
        std::thread t(&CBaseWorker::ThreadFunc, this);
        //t.join();
        t.detach();
    }
private:
    virtual void ThreadFunc()
    {
        while(m_bRunning)
        {
           std::cout< 

打印结果:
deMacBook-Pro demo % ./demo 

line:25  CBaseWorker...m_nCount=1
line:53 B Worker...m_nCount=2
line:40  A Worker...m_nCount=3

line:line:40  A Worker...m_nCount=4
25  CBaseWorker...m_nCount=5
line:53 B Worker...m_nCount=6
line:
line:25  CBaseWorker...m_nCount=7
40  A Worker...m_nCount=line:538
 B Worker...m_nCount=9

line:53 B Worker...m_nCount=10
line:40  A Worker...m_nCount=line:11
25  CBaseWorker...m_nCount=12
line:53 B Worker...m_nCount=13
line:40  A Worker...m_nCount=14

line:25  CBaseWorker...m_nCount=15
line:
line:25  CBaseWorker...m_nCount=16
53 B Worker...m_nCount=17
line:40  A Worker...m_nCount=18

line:25  CBaseWorker...m_nCount=19
line:53 B Worker...m_nCount=20
line:40  A Worker...m_nCount=21

line:25  CBaseWorker...m_nCount=22
line:40  A Worker...m_nCount=23
line:53 B Worker...m_nCount=24

line:line:25  CBaseWorker...m_nCount=25
line:53 B Worker...m_nCount=4026
  A Worker...m_nCount=27

**************  exit()  *****************
deMacBook-Pro demo % 

可以看出来,打印相当的混乱。

加入信号量同步
#include 
#include 
#include 
#include 
#include 

int g_nCount = 0;
sem_t *g_pSem = nullptr; //信号量
class CBaseWorker
{
public:
    CBaseWorker(){
    }
    virtual ~CBaseWorker(){
    }

    //启动线程
    void startJob()
    {
        m_bRunning = true;
        std::thread t(&CBaseWorker::ThreadFunc, this);
        //t.join();
        t.detach();
    }

    //停止线程
    void stopJob()
    {
        m_bRunning = false;

        // printSem(__LINE__);
        // //macos下,一个生产者+多个消费者,结束任务时,需要sem_post,否则会出现sem_close阻塞的情况,原因不明;linux正常;
        // while(sem_trywait(g_pSem))
        // {
        //     printSem(__LINE__);
        //     std::cout<<"line:"<<__LINE__<<"  will stop sem..."<>>> sem_getvalue error... ret="<>>> sem_getvalue nSemValue="< 

输出:
[root@VM-20-16-centos demo]# ./demo 
sem_open success.

line:59  send sem...
line:62 >>>> sem_getvalue nSemValue=1
line:77 >>>> sem_getvalue nSemValue=1
line:80 >>>> sem_getvalue nSemValue=0
line:81  A Worker...m_nCount=1
line:77 >>>> sem_getvalue nSemValue=0
line:96 >>>> sem_getvalue nSemValue=0

line:59  send sem...
line:62 >>>> sem_getvalue nSemValue=1
line:80 >>>> sem_getvalue nSemValue=0
line:81  A Worker...m_nCount=2
line:77 >>>> sem_getvalue nSemValue=0

line:59  send sem...
line:62 >>>> sem_getvalue nSemValue=1
line:99 >>>> sem_getvalue nSemValue=0
line:100 B Worker...m_nCount=3
line:96 >>>> sem_getvalue nSemValue=0

line:59  send sem...
line:62 >>>> sem_getvalue nSemValue=1
line:80 >>>> sem_getvalue nSemValue=0
line:81  A Worker...m_nCount=4
line:77 >>>> sem_getvalue nSemValue=0

line:59  send sem...
line:62 >>>> sem_getvalue nSemValue=1
line:99 >>>> sem_getvalue nSemValue=0
line:100 B Worker...m_nCount=5
line:96 >>>> sem_getvalue nSemValue=0

line:59  send sem...
line:62 >>>> sem_getvalue nSemValue=1
line:80 >>>> sem_getvalue nSemValue=0
line:81  A Worker...m_nCount=6
line:77 >>>> sem_getvalue nSemValue=0

line:59  send sem...
line:62 >>>> sem_getvalue nSemValue=1
line:99 >>>> sem_getvalue nSemValue=0
line:100 B Worker...m_nCount=7
line:96 >>>> sem_getvalue nSemValue=0

line:59  send sem...
line:62 >>>> sem_getvalue nSemValue=1
line:80 >>>> sem_getvalue nSemValue=0
line:81  A Worker...m_nCount=8
line:77 >>>> sem_getvalue nSemValue=0

line:59  send sem...
line:62 >>>> sem_getvalue nSemValue=1
line:99 >>>> sem_getvalue nSemValue=0
line:100 B Worker...m_nCount=9
line:96 >>>> sem_getvalue nSemValue=0

line:59  send sem...
line:62 >>>> sem_getvalue nSemValue=1
line:80 >>>> sem_getvalue nSemValue=0
line:81  A Worker...m_nCount=10
line:77 >>>> sem_getvalue nSemValue=0

**************  exit()  *****************
line:139 >>>> sem_getvalue nSemValue=0
************** sem_close  *****************
**************  sem_unlink  *****************
[root@VM-20-16-centos demo]# 

CMakeLists.txt

注意大小写敏感

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(demo)

add_compile_options(-std=c++11)

INCLUDE_DIRECTORIES(
    ${CMAKE_CURRENT_LIST_DIR}/
)

FILE(GLOB COMMON
    ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp
)

FILE(GLOB SOURCES
    ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp
)

ADD_EXECUTABLE(
    ${PROJECT_NAME} 
    ${SOURCES}
    ${COMMON}
)

TARGET_LINK_LIBRARIES(
    ${PROJECT_NAME}
    pthread
)

编译运行

cmake .

make

./demo

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/990704.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号