以下是实验程序的源代码:
/*********************** 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&#61;0;i<&#61;2;i&#43;&#43;)
{
printf("我是最初的进程&#xff01;\n");
sleep(2);
}
ret&#61;pthread_join(thread1,&thread_return1);/*等待第一个线程退出&#xff0c;并接收它的返回值*/
if(ret!&#61;0)
printf("调用pthread_join获取线程1返回值出现错误&#xff01;\n");
else
printf("pthread_join调用成功&#xff01;线程1退出后带回的值是%d\n",(int)thread_return1);
ret&#61;pthread_join(thread2,&thread_return2);/*等待第二个线程退出&#xff0c;并接收它的返回值*/
if(ret!&#61;0)
printf("调用pthread_join获取线程2返回值出现错误&#xff01;\n");
else
printf("pthread_join调用成功&#xff01;线程2退出后带回的值是%d\n",(int)thread_return2);
return 0;
}
void *thread1_func(void *arg)
{
int i;
struct argument *arg_thread1;/*这里定义了一个指向argument类型结构体的指针arg_thread1&#xff0c;用它来接收传过来的参数的地址*/
arg_thread1&#61;(struct argument *)arg;
for(i&#61;0;i<&#61;3;i&#43;&#43;)
{
printf("我来自线程1&#xff0c;传递给我的参数是%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&#xff0c;用来接收传过来的指针参数指向的值。这种方法和thread1_func函数中的方法都是可行的*/
arg_thread2&#61;*(struct argument *)arg;
for(i&#61;0;i<&#61;3;i&#43;&#43;)
{
printf("我来自线程2&#xff0c;传递给我的参数是%d,%s。\n",arg_thread2.num,arg_thread2.string);
sleep(2);
}
return (void *)456;
}
/*********************** 以上是 pthread.c 的内容***************************/
在Linux终端下用 gcc -o pthread
-lpthread pthread.c 命令进行编译&#xff0c;注意应该加上
-lpthread
./pthread 运行
// 运行结果 ///
我来自线程2&#xff0c;传递给我的参数是2009,建国六十周年。
我来自线程1&#xff0c;传递给我的参数是1949,中华人民共和国成立。
我是最初的进程&#xff01;
我来自线程2&#xff0c;传递给我的参数是2009,建国六十周年。
我是最初的进程&#xff01;
我来自线程1&#xff0c;传递给我的参数是1949,中华人民共和国成立。
我是最初的进程&#xff01;
我来自线程1&#xff0c;传递给我的参数是1949,中华人民共和国成立。
我来自线程2&#xff0c;传递给我的参数是2009,建国六十周年。
我来自线程2&#xff0c;传递给我的参数是2009,建国六十周年。
我来自线程1&#xff0c;传递给我的参数是1949,中华人民共和国成立。
pthread_join调用成功&#xff01;线程1退出后带回的值是123
pthread_join调用成功&#xff01;线程2退出后带回的值是456
&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;
可以从执行顺序看出&#xff0c;线程之间存在着竞争&#xff0c;并非是按照固定次序运行。
&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;
在这之后&#xff0c;将其移到Android模拟器中运行&#xff0c;编写Android.mk文件如下/***********************
Android.mk***************************/
LOCAL_PATH:&#61; $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:&#61; \
pthread.c
LOCAL_CFLAGS&#61;
#注意&#xff0c;这里一定要用
LOCAL_LDLIBS的方式加载pthread库&#xff0c;不能使用“LOCAL_CFLAGS&#61; -lpthread“或者”LOCAL_SHARED_LIBRARIES :&#61;libpthread“或者"LOCAL_STATIC_LIBRARIES :&#61;libpthread"的方式加载&#xff0c;否则会失败。
LOCAL_LDLIBS &#43;&#61; -lpthread
LOCAL_MODULE:&#61; pthread
include $(BUILD_EXECUTABLE)
/*********************** 以上是
Android.mk 的内容***************************/
编译执行&#xff0c;运行结果与在LINUX中类似。
转载者注&#xff1a;其实应该在Android.mk中加入这么一句话&#xff0c;要不编译可能通不过&#xff1a;LOCAL_MODULE_TAGS:&#61;optional