C++线程

本着能用STL就不用其他库的原则,本文以c++11的std::thread作为接口开发。【VS2010不支持C++11的线程,VS2013支持】

根据我另一个帖子,线程函数只能是全局或者静态的。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参数】作为参数传递

猜你喜欢

转载自www.cnblogs.com/judes/p/10863290.html