android中的多线程编程,Android中多线程编程并传递多个参数的简单例子

以下是实验程序的源代码:

/*********************** pthread.c ***************************/

#include

#include

#include

#include

#include

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;

}

/*********************** 以上是 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=

#注意,这里一定要用

LOCAL_LDLIBS的方式加载pthread库,不能使用“LOCAL_CFLAGS= -lpthread“或者”LOCAL_SHARED_LIBRARIES :=libpthread“或者"LOCAL_STATIC_LIBRARIES :=libpthread"的方式加载,否则会失败。

LOCAL_LDLIBS += -lpthread

LOCAL_MODULE:= pthread

include $(BUILD_EXECUTABLE)

/*********************** 以上是

Android.mk 的内容***************************/

编译执行,运行结果与在LINUX中类似。

转载者注:其实应该在Android.mk中加入这么一句话,要不编译可能通不过:LOCAL_MODULE_TAGS:=optional

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值