加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – std :: thread management:用法和最佳实践

发布时间:2020-12-16 10:43:59 所属栏目:百科 来源:网络整理
导读:我试图在 Java中使用它们之后弄清楚线程并且我有点困惑. 两个问题: 我可以从一个线程扩展我的类,还是我必须通过处理程序从类中管理线程? 如何保存所述线程处理程序? std :: thread in和它本身似乎没有命名一个类型. 任何正确方向的刺激都将非常感激. 我该
我试图在 Java中使用它们之后弄清楚线程并且我有点困惑.
两个问题:

>我可以从一个线程扩展我的类,还是我必须通过处理程序从类中管理线程?
>如何保存所述线程处理程序? std :: thread in和它本身似乎没有命名一个类型.

任何正确方向的刺激都将非常感激.

我该如何解释这条消息?

src/CHandler.h:27:9: error: 'thread' in namespace 'std' does not name a type
         std::thread _thread;
         ^

这是我尝试扩展线程:

src/CHandler.h:17:30: error: expected class-name before '{' token
 class CHandler : std::thread {
                              ^

完整,麻烦的标题:

#ifndef __projectm__CHandler__
#define __projectm__CHandler__

#include <set>
#include <vector>
#include <thread>

#include "CListener.h"

class CHandler {
    public:
        virtual bool subscribe(std::shared_ptr<CListener> aListener);
        virtual bool unsubscribe(std::shared_ptr<CListener> aListener);

        virtual bool hasSubscriber(std::shared_ptr<CListener> aListener);

        virtual ~CHandler() {}

    protected:
        std::thread _thread;
        std::vector<std::weak_ptr<CListener> > _subscribers;
        std::set<const CListener *> _subscribersSet;

        virtual void run();
};

#endif /* defined(__projectm__CDefaultHandler__) */

编译器版本:

bash-3.1$g++ --version
g++.exe (GCC) 4.8.1

makefile(一团糟,我知道 – 还在学习这个血腥的东西):

CC=g++

OUTFILE=game

BINDIR=bin
SRCDIR=src
OBJDIR=obj

CFLAGS=
LDFLAGS=-std=c++0x



all: core

# Ядро проекта.
core: $(OBJDIR)/main.o $(OBJDIR)/CGame.o $(OBJDIR)/CHandler.o $(OBJDIR)/CListener.o
    $(CC) $(CFLAGS) $(wildcard $(OBJDIR)/*.o) -o $(BINDIR)/$(OUTFILE)

$(OBJDIR)/main.o: $(OBJDIR)
    $(CC) $(LDFLAGS) $(SRCDIR)/main.cpp -c -o $(OBJDIR)/main.o

$(OBJDIR)/CGame.o: $(OBJDIR)
    $(CC) $(LDFLAGS) $(SRCDIR)/CGame.cpp -c -o $(OBJDIR)/CGame.o

$(OBJDIR)/CHandler.o: $(OBJDIR)
    $(CC) $(LDFLAGS) $(SRCDIR)/CHandler.cpp -c -o $(OBJDIR)/CHandler.o

$(OBJDIR)/CListener.o: $(OBJDIR)
    $(CC) $(LDFLAGS) $(SRCDIR)/CListener.cpp -c -o $(OBJDIR)/CListener.o

# Создаем директорию для объектов,если ее нет.
$(OBJDIR):
    mkdir $(OBJDIR)

main.o: $(SRC)/main.cpp

解决方法

Bjarne Stroustrup在他的 C++11 FAQ中显示了 some examples of using std::thread.最简单的例子如下所示:

#include<thread>

void f();

struct F {
    void operator()();
};

int main()
{
    std::thread t1{f};  // f() executes in separate thread
    std::thread t2{F()};    // F()() executes in separate thread
}

通常,std :: thread不打算从中继承.您传递一个函数以在构造函数中异步执行.

如果你的编译器不支持std :: thread,你可以改用Boost.Thread.它是fairly compatible,所以你可以在编译器支持后用std :: thread替换它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读