6.6.1 向线程传递参数
程序清单6-1显示了主线程从命令行给线程执行的函数传递一个参数。命令行参数还用于确定要创建的线程的数目。
程序清单6-1
- //Listing 6-1 Passing arguments to a thread from the command line.
-
- 1 using namespace std;
- 2
- 3 #include <iostream>
- 4 #include <pthread.h>
- 5
- 6
- 7 void *task1(void *X)
- 8 {
- 9 int *Temp;
- 10 Temp = static_cast<int *>(X);
- 11
- 12 for(int Count = 0;Count < *Temp;Count++)
- 13 {
- 14 cout << "work from thread: " << Count << endl;
- 15 }
- 16 cout << "Thread complete" << endl;
- 17 return (NULL);
- 18 }
- 19
- 20
- 21
- 22 int main(int argc, char *argv[])
- 23 {
- 24 int N;
- 25
- 26 pthread_t MyThreads[10];
- 27
- 28 if(argc != 2){
- 29 cout << "error" << endl;
- 30 exit (1);
- 31 }
- 32
- 33 N = atoi(argv[1]);
- 34
- 35 if(N > 10){
- 36 N = 10;
- 37 }
- 38
- 39 for(int Count = 0;Count < N;Count++)
- 40 {
- 41 pthread_create(&MyThreads[Count],NULL,task1,&N);
- 42
- 43 }
- 44
- 45
- 46 for(int Count = 0;Count < N;Count++)
- 47 {
- 48 pthread_join(MyThreads[Count],NULL);
- 49
- 50 }
- 51 return(0);
- 52
- 53
- 54 }
- 55
- 56
第26行声明了MyThreads,它是规模为10的数组,数组中的每一项类型为pthread_t。N持有命令行参数。在第41行,创建了MyThreads数组中的N个线程。N作为类型为void *的参数传递给每个线程。在函数task1中,该参数从void *强制类型转换为int *,如下所示:
- 10 Temp = static_cast < int * > (X);
函数执行一个循环,其迭代次数为传递给函数的值。函数将它的消息发送到标准输出。创建的每个线程执行这个函数。程序清单6-1的编译和执行指示包含在稍后位置的程序概要6-1中。
这个例子向线程函数传递一个命令行参数,并且使用该命令行参数来决定要创建的线程的数目。如果有必要向线程函数传递多个参数,您可以创建一个包含所有需要的参数的结构体(struct)或容器,然后将指向该数据结构的指针传递给线程函数。我们将在本章稍后部分介绍一种更容易的方式来完成这个目的,即创建线程对象。
程序概要6-1
程序名:
- program6-1.cc (程序清单6-1)
描述:
从命令行接收一个整数,并将该值传递给线程函数。线程函数执行一个循环,该循环向标准输出发送消息。参数用作循环变量的结束条件。参数还决定了要创建的线程数目,每个线程执行相同的函数。
必需的库:
- libpthread
必需的头文件:
- <pthread.h> <iostream>
编译和链接指令:
- c++ -o program6-1 program 6-1.cc -lpthread
测试环境:
- Solaris 10、gcc 3.4.3和gcc 3.4.6
处理器:
- Opteron和UltraSparc T1
执行指令:
- ./program6-1 5
注释:
这个程序要求一个命令行参数。