Linux中多线程编程并传递多个参数实例是本文讲解的内容,不多说,先来看内容。今天上午实验了Linux下的多线程编程,并将多个参数传递给线程要执行的函数。在Linux环境下编译通过后,还将它移到了Android的模拟器中。
以下是实验程序的源代码:
pthread.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
struct argument
{
int num;
char string[30];
};
int main()
{
int i,ret;
void *thread1_func(void *);
void *thread2_func(void *);
void *thread_return1,*thread_return2;/*用来接收两个线程退出后的返回值*/
pthread_t thread1,thread2;
struct argument arg1,arg2;
arg1.num=1949;
strcpy(arg1.string,"中华人民共和国成立");
arg2.num=2009;
strcpy(arg2.string,"建国六十周年");
pthread_create(&thread1,NULL,thread1_func,(void *)&arg1);
pthread_create(&thread2,NULL,thread2_func,(void *)&arg2);
for(i=0;i<=2;i++)
{
printf("我是最初的进程!\n");
sleep(2);
}
ret=pthread_join(thread1,&thread_return1);/*等待第一个线程退出,并接收它的返回值*/
if(ret!=0)
printf("调用pthread_join获取线程1返回值出现错误!\n");
else
printf("pthread_join调用成功!线程1退出后带回的值是%d\n",(int)thread_return1);
ret=pthread_join(thread2,&thread_return2);/*等待第二个线程退出,并接收它的返回值*/
if(ret!=0)
printf("调用pthread_join获取线程2返回值出现错误!\n");
else
printf("pthread_join调用成功!线程2退出后带回的值是%d\n",(int)thread_return2);
return 0;
}
void *thread1_func(void *arg)
{
int i;
struct argument *arg_thread1;/*这里定义了一个指向argument类型结构体的指针arg_thread1,用它来接收传过来的参数的地址*/
arg_thread1=(struct argument *)arg;
for(i=0;i<=3;i++)
{
printf("我来自线程1,传递给我的参数是%d,%s。\n",(*arg_thread1).num,(*arg_thread1).string);
sleep(2);
}
return (void *)123;
}
void *thread2_func(void *arg)
{
int i;
struct argument arg_thread2;/*这里定义了一个argument类型的结构体arg_thread2,用来接收传过来的指针参数指向的值。
这种方法和thread1_func函数中的方法都是可行的*/
arg_thread2=*(struct argument *)arg;
for(i=0;i<=3;i++)
{
printf("我来自线程2,传递给我的参数是%d,%s。\n",arg_thread2.num,arg_thread2.string);
sleep(2);
}
return (void *)456;
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
以上是 pthread.c 的内容
在Linux终端下用 gcc -o pthread -lpthread pthread.c 命令进行编译,注意应该加上-lpthread
./pthread 运行结果
我来自线程2,传递给我的参数是2009,建国六十周年。
我来自线程1,传递给我的参数是1949,中华人民共和国成立。
我是最初的进程!
我来自线程2,传递给我的参数是2009,建国六十周年。
我是最初的进程!
我来自线程1,传递给我的参数是1949,中华人民共和国成立。
我是最初的进程!
我来自线程1,传递给我的参数是1949,中华人民共和国成立。
我来自线程2,传递给我的参数是2009,建国六十周年。
我来自线程2,传递给我的参数是2009,建国六十周年。
我来自线程1,传递给我的参数是1949,中华人民共和国成立。
pthread_join调用成功!线程1退出后带回的值是123
pthread_join调用成功!线程2退出后带回的值是456
可以从执行顺序看出,线程之间存在着竞争,并非是按照固定次序运行。
在这之后,将其移到Android模拟器中运行,编写Android.mk文件如下
Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
pthread.c
LOCAL_CFLAGS=
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
#注意,这里一定要用LOCAL_LDLIBS的方式加载pthread库,不能使用“LOCAL_CFLAGS= -lpthread“或者”LOCAL_SHARED_LIBRARIES :=libpthread“或者"LOCAL_STATIC_LIBRARIES :=libpthread"的方式加载,否则会失败。
LOCAL_LDLIBS += -lpthread
LOCAL_MODULE:= pthread
include $(BUILD_EXECUTABLE)
- 1.
- 2.
- 3.
以上是 Android.mk 的内容
编译执行,运行结果与在LINUX中类似。
小结:解析Linux中多线程编程并传递多个参数实例的内容介绍完了,希望本文对你有所帮助!