面向对象的多线程编程
我们用一个简单的例子来结束这个编程系列。我们用C++类库重写一开始的例子。
//----test1.cpp----
#include <cstdio>
#include <Thread.h>
volatile bool g_iQuitFlag = false;
class MyTask1 : public Thread {
private:
void Run() {
for(;!g_iQuitFlag;) {
printf("I am alive.\n");
Thread::Sleep(3000);
}
}
};
class MyTask2 : public Thread {
public:
static const int MAX_I = 65534;
private:
int Sum(int n) {
if(n==0) {
return 0;
} else {
return n + Sum(n-1);
}
}
void Run() {
for(int i=1; (!g_iQuitFlag) && (i<MAX_I); ++i) {
int sum = Sum(i);
printf("Sum(1-->%d) = %d.\n", i, sum);
Thread::Sleep(2000);
}
}
};
int main()
{
MyTask1 task1;
MyTask2 task2;
task1.Start();
task2.Start();
char szBuf[1024];
while(true) {
fgets(szBuf, sizeof(szBuf), stdin);
if(0 == strncmp(szBuf, "quit", 4)) {
g_iQuitFlag = true;
break;
}
}
return 0;
}
//----EOF----
这个程序的功能和前面的C版本相同,但是C++类库让我们免于处理平台相关细节,从而使得编程简化。
另外,类似上面的例子并不能做很多事情,因为我们还不具备有效的手段来控制线程间的同步与互斥。多线程同步设计是多线程设计的重点工作之一,它的核心思想是,在必要情况下将并行处理串行化。关于同步与互斥的话题,我们将在另一个系列中对其进行详细讨论。