C++线程
本着能用STL就不用其他库的原则,本文以c++11的std::thread作为接口开发。【VS2010不支持C++11的线程,VS2013支持】
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
根据我另一个帖子,线程函数只能是全局或者静态的。https://www.cnblogs.com/judes/p/5921104.html
全局函数:只能访问全局变量,需要注意加互斥锁
静态函数:只能访问静态变量
那么能不能让类成员函数作为线程的入口呢?下面提供两种方式。
1、友元方式
一开始学习教学视频,讲师就说要少用友元函数,做了这么久项目也没咋遇到,更别说自己使用。突然在准备看看C++11线程的时候,发现还有实现标题的功能。
转:https://blog.csdn.net/qq_35097289/article/details/81504736
class ExampleTask { public: friend void taskmain(LPVOID param); void StartTask(); int value; }; void taskmain(LPVOID param) { ExampleTask * pTaskMain = (ExampleTask *) param; //通过pTaskMain指针引用 } void ExampleTask::StartTask() { _beginthread(taskmain,0,this); } int main(int argc, char* argv[]) { ExampleTask realTimeTask; realTimeTask.StartTask(); return 0;
}
这里的友元函数就是作为线程入口函数,并且参数是当前类,类似于将编译器为所有类成员函数加的默认this参数显示的写出来。此时在友元里是能够通过类指针this访问类成员变量的,达到标题要求。
2、经典买票程序,原理未知
转:https://blog.csdn.net/qq_22494029/article/details/79273127
SellTickts.h
#pragma once #include <thread> #include <mutex> #include <Windows.h>
using namespace std; class SellTickts { private: void SellTickts::seller_1(); void SellTickts::seller_2(); int ticketNum = 10000; mutex Mutex; public: SellTickts(); virtual ~SellTickts(); void sell(); };
SellTickts.cpp
#include "stdafx.h" #include "SellTickts.h" SellTickts::SellTickts() { } SellTickts::~SellTickts() { } void SellTickts::seller_1() { for (;;) { Mutex.lock(); if (ticketNum == 0) { break; } else { ticketNum--; printf("Seller_1 sold a ticket, remains %d.\n", ticketNum); if (ticketNum == 0) { printf("Tickets has been sold out.\n"); break; } } Sleep(100); Mutex.unlock(); } } void SellTickts::seller_2() { for (;;) { Mutex.lock(); if (ticketNum == 0) { break; } else { ticketNum--; printf("Seller_2 sold a ticket, remains %d.\n", ticketNum); if (ticketNum == 0) { printf("Tickets has been sold out.\n"); break; } } Sleep(100); Mutex.unlock(); } } void SellTickts::sell() { thread thread1(&SellTickts::seller_1,this); thread thread2(&SellTickts::seller_2,this); thread1.detach(); thread2.detach(); }
main.cpp
#include "stdafx.h" #include "SellTickts.h"
int _tmain(int argc, _TCHAR* argv[]) { SellTickts sellTickets; sellTickets.sell(); while (true) { } return 0; }
重点就在于标红的地方,线程函数声明时加上类名,线程初始化的地方加上引用符号,并且把this【这里可以理解,因为类函数本来就有一个默认的this参数】作为参数传递

更多精彩