解析Linux中多線程Android編程并傳遞多個參數(shù)實(shí)例
Linux中多線程編程并傳遞多個參數(shù)實(shí)例是本文講解的內(nèi)容,不多說,先來看內(nèi)容。今天上午實(shí)驗了Linux下的多線程編程,并將多個參數(shù)傳遞給線程要執(zhí)行的函數(shù)。在Linux環(huán)境下編譯通過后,還將它移到了Android的模擬器中。
以下是實(shí)驗程序的源代碼:
- 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("我是最初的進(jìn)程!\n");
- sleep(2);
- }
- ret=pthread_join(thread1,&thread_return1);/*等待第一個線程退出,并接收它的返回值*/
- if(ret!=0)
- printf("調(diào)用pthread_join獲取線程1返回值出現(xiàn)錯誤!\n");
- else
- printf("pthread_join調(diào)用成功!線程1退出后帶回的值是%d\n",(int)thread_return1);
- ret=pthread_join(thread2,&thread_return2);/*等待第二個線程退出,并接收它的返回值*/
- if(ret!=0)
- printf("調(diào)用pthread_join獲取線程2返回值出現(xiàn)錯誤!\n");
- else
- printf("pthread_join調(diào)用成功!線程2退出后帶回的值是%d\n",(int)thread_return2);
- return 0;
- }
- void *thread1_func(void *arg)
- {
- int i;
- struct argument *arg_thread1;/*這里定義了一個指向argument類型結(jié)構(gòu)體的指針arg_thread1,用它來接收傳過來的參數(shù)的地址*/
- arg_thread1=(struct argument *)arg;
- for(i=0;i<=3;i++)
- {
- printf("我來自線程1,傳遞給我的參數(shù)是%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類型的結(jié)構(gòu)體arg_thread2,用來接收傳過來的指針參數(shù)指向的值。
- 這種方法和thread1_func函數(shù)中的方法都是可行的*/
- arg_thread2=*(struct argument *)arg;
- for(i=0;i<=3;i++)
- {
- printf("我來自線程2,傳遞給我的參數(shù)是%d,%s。\n",arg_thread2.num,arg_thread2.string);
- sleep(2);
- }
- return (void *)456;
- }
以上是 pthread.c 的內(nèi)容
在Linux終端下用 gcc -o pthread -lpthread pthread.c 命令進(jìn)行編譯,注意應(yīng)該加上-lpthread
./pthread 運(yùn)行結(jié)果
我來自線程2,傳遞給我的參數(shù)是2009,建國六十周年。
我來自線程1,傳遞給我的參數(shù)是1949,中華人民共和國成立。
我是最初的進(jìn)程!
我來自線程2,傳遞給我的參數(shù)是2009,建國六十周年。
我是最初的進(jìn)程!
我來自線程1,傳遞給我的參數(shù)是1949,中華人民共和國成立。
我是最初的進(jìn)程!
我來自線程1,傳遞給我的參數(shù)是1949,中華人民共和國成立。
我來自線程2,傳遞給我的參數(shù)是2009,建國六十周年。
我來自線程2,傳遞給我的參數(shù)是2009,建國六十周年。
我來自線程1,傳遞給我的參數(shù)是1949,中華人民共和國成立。
pthread_join調(diào)用成功!線程1退出后帶回的值是123
pthread_join調(diào)用成功!線程2退出后帶回的值是456
可以從執(zhí)行順序看出,線程之間存在著競爭,并非是按照固定次序運(yùn)行。
在這之后,將其移到Android模擬器中運(yùn)行,編寫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 的內(nèi)容
編譯執(zhí)行,運(yùn)行結(jié)果與在LINUX中類似。
小結(jié):解析Linux中多線程編程并傳遞多個參數(shù)實(shí)例的內(nèi)容介紹完了,希望本文對你有所幫助!