首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

linux多线程事例

2013-01-27 
linux多线程例子一.基本功能1.最简单例子--创建线程/***创建线程**/#include stdio.h#include stdlib.h

linux多线程例子

一.基本功能

1.最简单例子--创建线程

/***创建线程**/#include <stdio.h>#include <stdlib.h>#include <pthread.h>void *thread1(void *arg){printf("this thread1!\n");}int main(int argc,char **argv){int ret;pthread_t tid;ret = pthread_create(&tid,NULL,thread1,NULL);sleep(4);return 0;}

2.传递简单参数

/***线程传递参数**/#include <stdio.h>#include <stdlib.h>#include <pthread.h>void *thread1(void *arg){char *prm=NULL;prm=(char*)arg;printf("arg=%s\n",prm);}int main(int argc,char **argv){int ret;pthread_t tid;ret = pthread_create(&tid,NULL,thread1,(void*)argv[1]);sleep(4);return 0;}

3.传递结构体参数

/***线程传递结构体**/#include <stdio.h>#include <stdlib.h>#include <pthread.h>typedef struct prm{int in;char ch[255];int *p;}oz;void *thread1(void *arg){oz *prm2 = NULL;prm2=(oz*)arg;printf(" prm:in=%d\n prm:ch=%s\n prm:p=%d\n",prm2->in,prm2->ch,*(prm2->p));}int main(int argc,char **argv){int ret;pthread_t tid;oz *prm1=malloc(sizeof(oz));prm1->in=3;sprintf(prm1->ch,"hello world!");prm1->p=malloc(sizeof(prm1->p));*(prm1->p)=123456;ret = pthread_create(&tid,NULL,thread1,(void*)prm1);sleep(4);return 0;}

4.主线程等待子线程结束

/***主线程等待子线程结束**/#include <stdio.h>#include <stdlib.h>#include <pthread.h>void *thread1(void *arg){char *prm=NULL;prm=(char*)arg;printf("arg=%s\n",prm);sleep(5);}int main(int argc,char **argv){int ret;pthread_t tid;ret = pthread_create(&tid,NULL,thread1,(void*)argv[1]);pthread_join(tid,NULL);return 0;}

5.获取线程id

/***获取线程id**/#include <stdio.h>#include <stdlib.h>#include <pthread.h>void *thread1(void *arg){char *prm=NULL;prm=(char*)arg;printf("thread1's id=%lu\n",pthread_self());sleep(5);}int main(int argc,char **argv){int ret;pthread_t tid;ret = pthread_create(&tid,NULL,thread1,(void*)argv[1]);printf("main thread's id=%lu\n",pthread_self());printf("child thread's id=%lu\n",tid);pthread_join(tid,NULL);return 0;}

6.子线程结束释放资源

/***子线程结束释放资源**/#include <stdio.h>#include <stdlib.h>#include <pthread.h>void *thread1(void *arg){char *prm=NULL;prm=(char*)arg;sleep(5);pthread_detach(pthread_self());}int main(int argc,char **argv){int ret;pthread_t tid;ret = pthread_create(&tid,NULL,thread1,(void*)argv[1]);pthread_join(tid,NULL);return 0;}

7.创建多个子线程;子线程退出;发送退出信号给子线程

/***创建多个子线程;子线程退出;发送退出信号给子线程**/#include <stdio.h>#include <stdlib.h>#include <pthread.h>void *thread2(void *arg){char *prm=NULL;int i=5;prm=(char*)arg;while(1){printf("thread2:%s\n",prm);sleep(1);}}void *thread1(void *arg){char *prm=NULL;int i=5;prm=(char*)arg;while(i--){printf("thread1:%s\n",prm);sleep(1);}pthread_detach(pthread_self());pthread_exit("omg!");}int main(int argc,char **argv){int ret;pthread_t tid1,tid2;void *join_ret;ret = pthread_create(&tid1,NULL,thread1,(void*)argv[1]);pthread_join(tid1,&join_ret);printf("thread1 exit return:%s\n",(char *)join_ret);ret = pthread_create(&tid2,NULL,thread2,(void*)argv[2]);sleep(5);if(!pthread_cancel(tid2))printf("cancel pthread2\n");pthread_join(tid2,NULL);return 0;}

8.一些错误的判断及处理

/***错误的判断及处理**/#include <stdio.h>#include <stdlib.h>#include <pthread.h>#include <errno.h>void *thread2(void *arg){char *prm=NULL;int i=5;prm=(char*)arg;while(1){printf("thread2:%s\n",prm);sleep(1);}}void *thread1(void *arg){char *prm=NULL;int i=5;prm=(char*)arg;while(i--){printf("thread1:%s\n",prm);sleep(1);}if(pthread_detach(pthread_self())!=0)exit(1);pthread_exit("omg!");}int main(int argc,char **argv){int ret;pthread_t tid1,tid2;void *join_ret;ret = pthread_create(&tid1,NULL,thread1,(void*)argv[1]);if(ret!=0){printf("can't create thread1: %s\n", (char *)strerror(ret));return -1;}if((ret=pthread_join(tid1,&join_ret))!=0){printf("pthread_join error %s\n",(char *)strerror(ret));return ret;}printf("thread1 exit return:%s\n",(char *)join_ret);ret = pthread_create(&tid2,NULL,thread2,(void*)argv[2]);if(ret!=0){printf("can't create thread2: error num:%d\n", errno);return errno;}sleep(5);if(!pthread_cancel(tid2)){printf("cancel pthread2\n");}elsepthread_join(tid2,NULL);return 0;}

9.主线程发送信号给子线程

/***主线程发送信号给子线程**/#include <stdio.h>#include <stdlib.h>#include <pthread.h>#include <signal.h>void kill_handler(int i){printf("kill_handler\n");}void *thread1(void *arg){char *prm=NULL;prm=(char*)arg;printf("arg=%s\n",prm);while(1);}int main(int argc,char **argv){int ret;pthread_t tid;ret = pthread_create(&tid,NULL,thread1,(void*)argv[1]);signal(SIGQUIT,kill_handler);sleep(5);if(pthread_kill(tid,SIGQUIT)==0)printf("signal to pthread!\n");while(1);return 0;}

10.pthread_cleanup_push/pop

/***pthread_cleanup_push/pop**/#include <stdio.h>#include <stdlib.h>#include <pthread.h>void cleanup(void *arg){char* prm=NULL;prm=(char*)arg;printf("cleanup arg=%s\n",prm);}void *thread1(void *arg){char *prm=NULL;prm=(char*)arg;pthread_cleanup_push(cleanup,(void*)prm);printf("arg=%s\n",prm);pthread_cleanup_pop(1);}int main(int argc,char **argv){int ret;pthread_t tid;ret = pthread_create(&tid,NULL,thread1,(void*)argv[1]);pthread_join(tid,NULL);return 0;}


二.线程同步

第1部分 线程属性

1.detachstate

/***detachstate**/#include <stdio.h>#include <stdlib.h>#include <pthread.h>void *thread1(void *arg){char *prm=NULL;prm=(char*)arg;printf("arg=%s\n",prm);sleep(5);}int main(int argc,char **argv){int ret;pthread_t tid;pthread_attr_t attr;int detachstate;pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_JOINABLE);ret = pthread_create(&tid,&attr,thread1,(void*)argv[1]);if(ret!=0){printf("pthread_create fail!\n");return ret;}ret = pthread_attr_getdetachstate (&attr, &detachstate);if(ret!=0){printf("pthread_attr_getdetachstate error!\n");}if((detachstate==PTHREAD_CREATE_DETACHED)||(detachstate==PTHREAD_CREATE_JOINABLE)){if(detachstate==PTHREAD_CREATE_DETACHED)printf("PTHREAD_CREATE_DETACHED\n");elseprintf("PTHREAD_CREATE_JOINABLE\n");}pthread_attr_destroy(&attr);pthread_join(tid,NULL);return 0;}

2.guardsize

/***guardsize**/#include <stdio.h>#include <stdlib.h>#include <pthread.h>void *thread1(void *arg){char *prm=NULL;prm=(char*)arg;printf("arg=%s\n",prm);sleep(5);}int main(int argc,char **argv){int ret;pthread_t tid;pthread_attr_t attr;size_t  guardsize;pthread_attr_init(&attr); pthread_attr_setguardsize(&attr,4093);ret = pthread_create(&tid,&attr,thread1,(void*)argv[1]);if(ret!=0){printf("pthread_create fail!\n");return ret;}ret = pthread_attr_getguardsize (&attr, &guardsize);if(ret!=0){printf("pthread_attr_getguardsize error!\n");}else{printf("guardsize=%d\n",guardsize);}pthread_attr_destroy(&attr);pthread_join(tid,NULL);return 0;}

3.inheritsched

/***inheritsched**/#include <stdio.h>#include <stdlib.h>#include <pthread.h>void *thread1(void *arg){char *prm=NULL;prm=(char*)arg;int ret;pthread_attr_t attr;int inheritsched;pthread_attr_init(&attr); pthread_attr_setinheritsched(&attr,PTHREAD_EXPLICIT_SCHED);printf("arg=%s\n",prm);sleep(5);ret = pthread_attr_getinheritsched(&attr, &inheritsched);if(ret!=0){printf("pthread_attr_getguardsize error!\n");}if((inheritsched==PTHREAD_INHERIT_SCHED)||(inheritsched==PTHREAD_EXPLICIT_SCHED)){if(inheritsched==PTHREAD_INHERIT_SCHED)printf("PTHREAD_INHERIT_SCHED\n");if(inheritsched==PTHREAD_EXPLICIT_SCHED)printf("PTHREAD_EXPLICIT_SCHED\n");}pthread_attr_destroy(&attr);}int main(int argc,char **argv){int ret;pthread_t tid;ret = pthread_create(&tid,NULL,thread1,(void*)argv[1]);if(ret!=0){printf("pthread_create fail!\n");return ret;}pthread_join(tid,NULL);return 0;}

 

第2部分 mutex

1.mutex简单应用

/***mutex简单应用**/#include <stdio.h>#include <stdlib.h>#include <pthread.h>pthread_mutex_t mutex;int sum=0;void *thread3(void *arg){char *prm=NULL;prm=(char*)arg;sleep(2);pthread_mutex_trylock(&mutex);while(1){sum++;if(sum==10)break;printf("thread3:%d\n",sum);sleep(1);}pthread_mutex_unlock(&mutex);}void *thread2(void *arg){char *prm=NULL;prm=(char*)arg;sleep(1);pthread_mutex_lock(&mutex);while(1){sum--;if(sum<0)break;printf("thread2:%d\n",sum);sleep(1);}pthread_mutex_unlock(&mutex);}void *thread1(void *arg){char *prm=NULL;prm=(char*)arg;pthread_mutex_lock(&mutex);while(1){sum++;if(sum==10)break;printf("thread1:%d\n",sum);sleep(1);}pthread_mutex_unlock(&mutex);}int main(int argc,char **argv){int ret;pthread_t tid1,tid2,tid3;pthread_mutex_init(&mutex,NULL);ret = pthread_create(&tid1,NULL,thread1,(void*)argv[1]);ret = pthread_create(&tid2,NULL,thread2,(void*)argv[1]);ret = pthread_create(&tid3,NULL,thread2,(void*)argv[1]);pthread_join(tid1,NULL);pthread_join(tid2,NULL);pthread_join(tid3,NULL);pthread_mutex_destroy(&mutex);return 0;}

2.进程mutex

/***进程mutex**/#include <stdio.h>#include <stdlib.h>#include <pthread.h>#include <sys/shm.h>#include <sys/types.h>#include <sys/ipc.h>typedef struct dev{int i;pthread_mutex_t mutex;}DEV;int main(int argc,char **argv){int ret;DEV *device=malloc(sizeof(DEV));unsigned long j=0;pthread_mutexattr_t mutexattr;int shmid;shmid=shmget(123,sizeof(DEV*),IPC_CREAT|0660);shmctl(shmid,IPC_RMID,0);shmid=shmget(123,sizeof(DEV*),IPC_CREAT|0660);if(shmid==-1)perror("shmget()");pthread_mutexattr_init(&mutexattr);pthread_mutexattr_setpshared(&mutexattr,PTHREAD_PROCESS_SHARED);pthread_mutex_init(&(device->mutex),&mutexattr);ret = fork();if(ret==-1){printf("fork error!\n");}if (ret==0){device=(DEV*)shmat(shmid,0,0);printf("father!\n");char buffer[1024];while(1){pthread_mutex_lock(&(device->mutex));(device->i)--;printf("father : i = %d\n",(device->i));//pthread_mutex_unlock(&(device->mutex));//尝试注释sleep(1);}pthread_mutexattr_destroy(&mutexattr);pthread_mutex_destroy(&mutex);return 0;}else{printf("child!\n");device=(DEV*)shmat(shmid,0,0);while(1){pthread_mutex_lock(&(device->mutex));(device->i)++;printf("child : i = %d\n",(device->i));pthread_mutex_unlock(&(device->mutex));sleep(1);}return 0;}}

3.线程mutex

/***线程mutex**/#include <stdio.h>#include <stdlib.h>#include <pthread.h>int i=0;char buffer[1024];pthread_mutex_t mutex;void *thread2(void *arg){while(1){pthread_mutex_lock(&mutex);i++;printf("thread2 %d\n",i);if(fgets(buffer,1024,stdin)!=NULL) pthread_mutex_unlock(&mutex);sleep(1);}}void *thread1(void *arg){while(1){pthread_mutex_lock(&mutex);i--;printf("thread1 %d\n",i);if(fgets(buffer,1024,stdin)!=NULL) pthread_mutex_unlock(&mutex);sleep(1);}}int main(int argc,char **argv){int ret;pthread_t tid1,tid2;pthread_mutexattr_t mutexattr;pthread_mutexattr_init(&mutexattr);pthread_mutexattr_setpshared(&mutexattr,PTHREAD_PROCESS_PRIVATE);pthread_mutex_init(&mutex,&mutexattr);ret = pthread_create(&tid1,NULL,thread1,NULL);ret = pthread_create(&tid1,NULL,thread2,NULL);pthread_join(tid1,NULL);pthread_join(tid2,NULL);pthread_mutexattr_destroy(&mutexattr);pthread_mutex_destroy(&mutex);return 0;}


第3部分 条件变量
1.线程+mutex+cond

/***线程+mutex+cond**/#include <stdio.h>#include <stdlib.h>#include <pthread.h>pthread_mutex_t mutex;pthread_cond_t cond;int i=0;void *thread2(void *arg){while(i!=30){pthread_mutex_lock(&mutex);i++;if(!(i%6))pthread_cond_signal(&cond);printf("thread2 %d\n",i);pthread_mutex_unlock(&mutex);sleep(1);}}void *thread1(void *arg){while(i!=30){pthread_mutex_lock(&mutex);pthread_cond_wait(&cond,&mutex);printf("thread1-%d\n",i);pthread_mutex_unlock(&mutex);sleep(1);}}int main(int argc,char **argv){int ret;pthread_t tid1,tid2;pthread_condattr_t attr;pthread_mutexattr_t mutexattr;pthread_mutexattr_init(&mutexattr);pthread_mutexattr_setpshared(&mutexattr,PTHREAD_PROCESS_PRIVATE);pthread_condattr_init(&attr);pthread_condattr_setpshared(&attr,PTHREAD_PROCESS_PRIVATE);pthread_mutex_init(&mutex,&mutexattr);pthread_cond_init(&cond,&attr);ret = pthread_create(&tid1,NULL,thread1,(void*)argv[1]);ret = pthread_create(&tid2,NULL,thread2,(void*)argv[1]);pthread_join(tid1,NULL);pthread_join(tid2,NULL);printf("all thread done!\n");pthread_condattr_destroy(&attr);pthread_cond_destroy(&cond);pthread_mutexattr_destroy(&mutexattr);pthread_mutex_destroy(&mutex);return 0;}


线程+mutex+cond+互锁

/***线程+mutex+cond+互锁**/#include <stdio.h>#include <stdlib.h>#include <pthread.h>pthread_mutex_t mutex;pthread_cond_t cond;int i=0;char buffer[1024];void *thread2(void *arg){while(i!=30){pthread_mutex_lock(&mutex);if(fgets(buffer,1024,stdin)!=NULL){if(buffer[0]!='2'){pthread_cond_signal(&cond);printf("thread2 pthread_cond_signal\n");pthread_mutex_unlock(&mutex);}}else{printf("thread2 pthread_cond_wait\n");pthread_cond_wait(&cond,&mutex);}printf("thread2 running\n");sleep(1);}}void *thread1(void *arg){while(i!=30){pthread_mutex_lock(&mutex);if(fgets(buffer,1024,stdin)!=NULL){if(buffer[0]!='1'){pthread_cond_signal(&cond);printf("thread1 pthread_cond_signal\n");pthread_mutex_unlock(&mutex);}}else{printf("thread1 pthread_cond_wait\n");pthread_cond_wait(&cond,&mutex);}printf("thread1 running\n");sleep(1);}}int main(int argc,char **argv){int ret;pthread_t tid1,tid2;pthread_condattr_t attr;pthread_mutexattr_t mutexattr;pthread_mutexattr_init(&mutexattr);pthread_mutexattr_setpshared(&mutexattr,PTHREAD_PROCESS_PRIVATE);pthread_condattr_init(&attr);pthread_condattr_setpshared(&attr,PTHREAD_PROCESS_PRIVATE);pthread_mutex_init(&mutex,&mutexattr);pthread_cond_init(&cond,&attr);ret = pthread_create(&tid1,NULL,thread1,(void*)argv[1]);ret = pthread_create(&tid2,NULL,thread2,(void*)argv[1]);pthread_join(tid1,NULL);pthread_join(tid2,NULL);printf("all thread done!\n");pthread_condattr_destroy(&attr);pthread_cond_destroy(&cond);pthread_mutexattr_destroy(&mutexattr);pthread_mutex_destroy(&mutex);return 0;}



 

 

 

有时间再继续写下去



 

热点排行