#include<iostream>
#include<thread>
#include<stdio.h>
#include<string.h>
using namespace std;
void fun()//定义线程入口函数
{
cout << "Let us start up Thread!\n";
}
class Asor{
thread& t;
public:
Asor(Asor &const) = delete;//删除拷贝构造函数
Asor& operator=(Asor const&) = delete;//拷贝赋值操作被标记为 =delete
//是为了不让编译器自动生成它们。直接
//对一个对象进行拷贝或赋值是危险的,因为这可能会弄丢已经加入的线程。通过删除声明,
//任何尝试给thread_guard对象赋值的操作都会引发一个编译错误
static void disfound() { cout << "1" << endl; }
};
void f(int i, string const& s) {
cout << i << " ";
cout<< s.data() << endl;//将string类型转换为char*的方法一
cout << const_cast<char*>(s.c_str());//方法二
char*p=NULL;
int n;
cin >> n;
p = (char*)malloc(n);
s.copy(p,5,0);//这里5,代表复制几个字符,0代表复制的位置
*(p + 5) = '\0';// //要手动加上结束符
cout << *p << endl;
}
class X {
public:
void func(int) {}
};
void look_friend(int some_params) {
char buffer[1024];
sprintf(buffer, "%i",some_params);
std::thread t(f, 3, std::string(buffer)); // 使用std::string,避免悬垂指针
t.detach();
}
//方法三传递成员函数指针作为线程函数并提供一个合适的对象指针作为第一个参数
int main()
{
//注意thread对象销毁之前还没有做出决定,程序就会终止
thread _m(fun);//thread 的析构函数会调用 std::terminate()
_m.join();//线程加入
//_m.detach();//线程分离
Asor::disfound();
string s = "1231";
f(2, ref(s));//通过ref将参数s转换成引用使得传入的为s对象的引用,而不是变量内部拷贝的引用
//方法三
X res;
//创建线程
int num(0);
thread _t(&X::func, &res, num);
_t.join();
return 0;
}