threat.hpp
cpp
#ifndef _THREAD_HPP_
#define _THREAD_HPP_
#include <cstring>
#include <iostream>
#include <pthread.h>
#include <string>
#include <cstring>
#include <cstdio>
#include<functional>
namespace Z {
static int number = 1;
class thread {
using func_t = std::function<void()>;
private:
void EnableDetach() {
std::cout << "线程被分离了" << std::endl;
_isdetach = true;
}
void EnableRunning() {
std::cout << "线程启动" << std::endl;
_isrunning = true;
}
static void *routine(void *args) {
thread *self = static_cast<thread *>(args);
self->EnableRunning();
if(self->_isdetach)
self->Detach();
pthread_setname_np(self->_tid,self->_name.c_str());
self->_func();
return nullptr;
}
public:
thread(func_t func) : _tid(0), _isdetach(false), _isrunning(false), _ret(nullptr), _func(func)
{
_name = "thread-"+std::to_string(number++);
}
void Detach() {
if (_isdetach)
return;
if (_isrunning)
pthread_detach(_tid);
EnableDetach();
}
bool Start() {
if (_isrunning)
return false;
int p = pthread_create(&_tid, nullptr, routine, this);
if (p != 0) {
std::cerr << "create threat fail!" << std::endl;
return false;
} else {
{
std::cout << _name << "create success" << std::endl;
return true;
}
}
}
void Join() {
if (_isdetach) {
std::cout << "线程已分离,无法join" << std::endl;
return;
}
int n = pthread_join(_tid, &_ret);
if (n != 0) {
std::cerr << "join 失败了" << strerror(n) << std::endl;
} else {
std::cout << "join success" << std::endl;
}
}
bool Stop() {
if (_isrunning) {
int n = pthread_cancel(_tid);
if (n != 0) {
std::cerr << "create thread error: " << strerror(n) << std::endl;
return false;
} else {
_isrunning = false;
std::cout << _name << "stop" << std::endl;
return true;
}
}
return true;
}
~thread() {
}
private:
pthread_t _tid;
std::string _name;
bool _isdetach;
bool _isrunning;
void *_ret;
func_t _func;
};
}
#endif
test.cc
cpp
#include "thread.hpp"
#include <unistd.h>
using namespace Z;
int main() {
std::vector<thread> threads;
for (int i = 0; i < 10; i++) {
threads.emplace_back([]() {
while (true) {
char name[128];
pthread_getname_np(pthread_self(), name, sizeof(name));
std::cout << "我是一个新线程" << "name: " << name << std::endl;
sleep(1);
}
});
}
for(auto &thread:threads)
{
thread.Start();
}
for(auto &thread:threads)
{
thread.Join();
}
return 0;
}