目录
最终目标:
纯线程无信号量
打印结果:
加入信号量同步
输出:
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
打印结果:
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
输出:
[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



