6.5 简单的线程程序
下面是一个简单的线程程序示例。这个简单的多线程程序有一个主线程以及线程将要执行的函数。并发模型决定了线程创建和管理的方式。我们将在下一章中讨论并发模型。线程可以一次性创建,或者在特定条件下创建。在示例6-1中,使用了委托模型来说明简单的多线程程序。
示例6-1
- // Example 6-1 Using the delegation model in a simple threaded program.
-
- using namspace std;
- #include <iostream>
- #include <pthread.h>
-
- void *task1(void *X) //define task to be executed by ThreadA
- {
- cout << "Thread A complete" << endl;
- return (NULL);
- }
-
- void *task2(void *X) //define task to be executed by ThreadB
-
- {
- cout << "Thread B complete" << endl;
- return (NULL);
- }
-
- int main(int argc, char *argv[])
- {
- pthread_t ThreadA,ThreadB; // declare threads
-
- pthread_create(&ThreadA,NULL,task1,NULL); // create threads
- pthread_create(&ThreadB,NULL,task2,NULL);
- // additional processing
- pthread_join(ThreadA,NULL); // wait for threads
- pthread_join(ThreadB,NULL);
- return (0);
- }
在示例6-1中,主线程是boss线程。boss线程声明两个线程,即ThreadA和ThreadB。pthread_create( )创建线程并将它们同将要执行的任务关联起来。task1和task2这两个任务被分别发送消息到标准输出。pthread_create( )使得线程立即执行它们分配到的任务。函数pthread_join的工作方式同wait( )对进程的工作方式相同。主线程等待,直到两个线程都返回。图6-4包含了显示示例 6-1的控制流的顺序图。在图6-4中,pthread_create( )使得在主线程的控制流中产生了分支。增加了两个并发执行的控制流,分别是ThreadA和ThreadB。pthread_create( )在创建完线程之后立即返回,因为它是一个异步函数。当每个线程执行自己的指令集合时,pthread_join( )使得主线程等待,直到线程终止并重新加入到主控制流。
|
| (点击查看大图)图6-4 |
编译和链接线程程序
所有使用POSIX线程库的多线程程序必须包含这个头文件:
- <pthread.h>
为了在Unix或Linux环境中使用g++或gcc命令行编译器来编译和链接多线程程序,需要确保通过使用-l编译器开关将pthread库链接到您的应用程序。这个开关之后紧接的就是库的名称:
- -lpthread
这样将导致您的应用程序链接到同POSIX 1003.1c标准定义的多线程接口兼容的库。名为libpthread.so的pthread库应当位于系统保存标准库的目录下,通常为/usr/lib。如果它位于该标准目录下,则编译行应当类似于:
- g++ -o a.out test_thread.cpp -lpthread
如果它没有位于标准位置,则使用-L选项来让编译器在搜索标准位置之前,首先在特定目录下进行查看:
- g++ -o a.out -L /src/local/lib test_thread.cpp -lpthread
这样就会告知编译器在搜索标准位置之前,首先在/src/local/lib目录下查找pthread库。
注意:
如同您将在本章稍后部分看到的那样,本书中的完整程序都伴随有程序概要。程序概要包含实现细节,例如必需的头文件和库以及编译器和链接指令。概要还包含注释部分,其中包含了在执行程序时需要遵从的任何特殊考虑。对于示例,则没有概要。