| 当前位置:精盈人才鹰网 > Linux技术交流 > 正文 |
| Linux pthread 编程 |
|
Linux下线程级编程并不是很复杂,但是不容易使用。最主要的原因是编程人员对于Linux系统自身的线程机制理解的不是很深刻,在这种情况下去使用线程那么许多“看不到”的事情就会降临,自然线程的编写者是看不到这些的。所以线程看起来比较简单,实则,是需要经过精心修炼才能运用自如的。下面是我个人在学习线程编程过程中积累的一点经验,记录如下:YimLinux联盟 YimLinux联盟 什么是线程?YimLinux联盟 Window下线程的概念应该已经很成熟,那么Linux的线程是不是跟windows一样呢?我们不必深究其中的细节,它们的共同目标就是让一个进程能够更快的执行自己的代码,更高效的工作。这就是说如果有一个任务,你不想用多进程实现,但又希望它工作的很快,你可以选择多线程。至于多线程跟多进程,那个更,在此我不讲述,有兴趣的自己学习相关的资料吧。YimLinux联盟 YimLinux联盟 线程的创建方法YimLinux联盟 YimLinux联盟 我们知道进程的创建需要fork来完成。那么,线程也差不多需要调用系统调用来产生新的线程。linux下就是pthread_create()这个API,只要将必要的参数初始化就可以产生一个新的线程执行自己的代码。YimLinux联盟 YimLinux联盟 首先,介绍一下线程所需要的头文件pthread.h。包含了这个头文件以后,我们就可以使用线程相关的API以及数据结构了(注意:包含头文件的同时,编译的时候要加上-lpthread告诉编译器线lib的位置)。YimLinux联盟 YimLinux联盟 下面,介绍线程相关的数据结构和API:YimLinux联盟 pthread_t是一个表示线程类型的数据结构,只要有一个线程就存在一个这样的标识符。它是在创建线程的时候必须指定的,跟进程标识符很相似。YimLinux联盟 YimLinux联盟 pthread_create()这个API是创建线程的一个API,所有关于新线程的设置都要在这里指定。因此,它的参数比较复杂,我们一个一个看。YimLinux联盟 YimLinux联盟 练习的code:YimLinux联盟 YimLinux联盟 int thx = 10;YimLinux联盟 int thy = 100;YimLinux联盟 sem_t sem;YimLinux联盟 YimLinux联盟 void* thread_print(void* parameter){YimLinux联盟 unsigned int i = *((unsigned int*)parameter);YimLinux联盟 while(i--){YimLinux联盟 sem_wait(&sem);YimLinux联盟 fprintf(stderr, "in thread_print!\n");YimLinux联盟 }YimLinux联盟 return (void*)(thx);YimLinux联盟 }YimLinux联盟 void* thread_print0(void* parameter){YimLinux联盟 unsigned int i = *((unsigned int*)parameter);YimLinux联盟 while(i--){YimLinux联盟 sem_wait(&sem);YimLinux联盟 fprintf(stderr, "in thread_print 00000!\n");YimLinux联盟 }YimLinux联盟 return (void*)(thy);YimLinux联盟 }YimLinux联盟 YimLinux联盟 cout<<"Pthread programming test!"<<endl;YimLinux联盟 pthread_t thread_id;YimLinux联盟 pthread_t thread_id0;YimLinux联盟 sem_init(&sem, 0 , 200);YimLinux联盟 int thread_data = 100;YimLinux联盟 int thread_data0 = 100;YimLinux联盟 int res, res0;YimLinux联盟 int* pres = & res;YimLinux联盟 int* pres0 = & res0;YimLinux联盟 pthread_create(&thread_id, NULL, &thread_print, &thread_data);YimLinux联盟 pthread_create(&thread_id0, NULL, &thread_print0, &thread_data0);YimLinux联盟 pthread_join(thread_id, (void**)(&(res)));YimLinux联盟 pthread_join(thread_id0, (void**)&(res0));YimLinux联盟 cout<<"thread res is "<<res<<"thread0 res 0 is "<<res0<<endl;YimLinux联盟
|
|
|