最近遇到在windows 系統下 建立thread 的問題
若是原始的c語言到是建立沒甚麼問題
簡單的 include 標頭檔
#include <process.h>
就可以簡簡單單的開啟
_beginthread()
_beginthreadex()
這兩個system call 參數的話就請自行上網googel
_beginthread() 的參數比較簡單 但其實問題很多
_beginthreadex() 參數比較多,其問題比較少,算是比較安全的thread 呼叫
可是我是懶人,所以是用_beginthread 下去寫XD
在c++裡面 規定static member 不可以呼叫 non-static member
原因是因為其C++為物件導向, 這樣呼叫的話並不知道要叫哪一個物件的 non-static member 起來run
又或者物件根本沒有創出來 哪裡來的member 可以run
所以如果開啟thread 跑某個 C++ 的non-static member 怎麼辦呢
其實就只要告訴thread 你的物件是哪一個(就是指定物件的意思)
這樣子就可以跑囉,簡單來說就是這樣
所以不外乎是呼叫thread 時就把 物件的this 傳進去 ,或把物件的address 傳進去
這邊就丟了一些sample code 分別是由淺到深
網路上參考來的,沒試過能不能跑,但是只要吸收概念聰明的 programer 應該就會寫了
ex1.
#include <windows.h>
#include <process.h>
#include <iostream>
using namespace std;
void threadProc(void* p)
{
char *data = (char*)p;
cout << "Starting -- " << data << endl;
Sleep(3000);
cout << "Ending -- " << data << endl;
delete [] data;
}
int main()
{
char *Data1 = new char[99];
strcpy(Data1, "Testing 1");
_beginthread(threadProc, 0, (void*)Data1 );
char *Data2 = new char[99];
strcpy(Data2, "Testing 2");
_beginthread(threadProc, 0, (void*)Data2 );
Sleep(3000);
}
ex2.
class Class
{
public:
void fun_1(void)
{
_beginthread( &Class::static_fun_2, 0, this );
}
void fun_2(void)
{
printf("hello");
}
private:
static void static_fun_2( void * args )
{
static_cast<Class*>(args)->fun_2();
}
};
ex3.
#include <iostream>
#include <process.h>
class MyClass {
private:
void myThread();
static void launchThread(void*);
public:
static void start(MyClass*);
};
void MyClass::myThread() {
std::cout << "myThread started" << std::endl;
}
// static
void MyClass::start(MyClass* c) {
_beginthread(&MyClass::launchThread, 0, c);
}
// static
void MyClass::launchThread(void* arg) {
MyClass* obj = static_cast<MyClass*>(arg);
obj->myThread();
}
int main() {
MyClass cl = MyClass();
MyClass::start(&cl);
// you should wait for the thread to end here in some way..
system("pause");
return 0;
}
最後稍微貼一下初處
在第三個連結裡 有說明_beginthreadex的使用 還蠻清楚的
另外還有 pthread
至於pthread 呢 這又是另外一個故事了
thanks very much
回覆刪除