您的位置  首页 >> 学习园地 >> JAVA技术 >> 正文
解析Linux中多线程编程并传递多个参数
[来源:本站 | 日期:2011年12月27日 | 浏览1006 次] 字体:[ ]
Linux中多线程编程并传递多个参数实例是本文讲解的内容,不多说,先来看内容。今天上午实验了Linux下的多线程编程,并将多个参数传递给线程要执行的函数。在Linux环境下编译通过后,还将它移到了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中类似。

  小结:解析Linux中多线程编程并传递多个参数实例的内容介绍完了,希望本文对你有所帮助!


责任编辑:admin