1.简单线程操作
/************************************************************************* > File Name: c.c > Author: bf > Mail: > Created Time: 2014年10月15日 星期三 19时03分20秒 ************************************************************************/ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<fcntl.h> #include<netinet/in.h> #include<arpa/inet.h> #include <pthread.h> int cnt=0; void *thread(void *vargp) { pthread_detach(pthread_self()); int i=0; for(;i<5;i++) { if(i==6)pthread_exit(NULL); printf("In thread cnt=%d ",cnt++); } pthread_t id=pthread_self(); printf("id=%u ",(unsigned int)id); printf("cnt=%d ",cnt); return NULL; } void *thread1(void *vargp) { pthread_detach(pthread_self()); int i=0; for(;i<3;i++) printf("pthread1 "); for(i=0;i<3;i++) cnt++; printf("cnt=%d ",cnt); return 0; /*exit(0);*/ } void *thread2(void *vargp) { pthread_detach(pthread_self()); int i=0; for(;i<3;i++) printf("pthread2 "); for(i=0;i<3;i++) cnt++; printf("cnt=%d ",cnt); return 0; /*exit(0);*/ } void *thread3(void *vargp) { pthread_detach(pthread_self()); int i=0; for(;i<3;i++) printf("pthread3 "); for(i=0;i<3;i++) cnt++; printf("cnt=%d ",cnt); return 0; /*exit(0);*/ } int main() { /*printf("In main() ");*/ pthread_t tid,tid1,tid2,tid3; pthread_create(&tid,NULL,thread,NULL); pthread_create(&tid1,NULL,thread1,NULL); pthread_create(&tid2,NULL,thread2,NULL); pthread_create(&tid3,NULL,thread3,NULL); int i=0; for(;i<5;i++) { if(i==6)pthread_exit(NULL); printf("In main2 cnt=%d ",cnt++); } pthread_t id=pthread_self(); printf("id=%u ",(unsigned int)id); /* pthread_join(tid,NULL); pthread_join(tid1,NULL); pthread_join(tid2,NULL); pthread_join(tid3,NULL); */ printf("cnt=%d ",cnt); /*printf("In main3 ");*/ return 0; /*exit(0);*/ }
2.信号量同步机制
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<fcntl.h> #include<netinet/in.h> #include<arpa/inet.h> #include <pthread.h> #include <semaphore.h> char **ptr; int cnt=0; sem_t mutex; void *thread(void *vargp) { int i,myid=(int)vargp; for(i=0;i<myid;i++) { sem_wait(&mutex); cnt++; sem_post(&mutex); } return NULL; } void *thread1(void *vargp) { int i,myid=(int)vargp; for(i=0;i<myid;i++) { sem_wait(&mutex); cnt++; sem_post(&mutex); } return NULL; } int main() { int i=1000000; pthread_t tid,tid1; char *msgs[2]={"Hello 1","Hello 2"}; ptr=msgs; sem_init(&mutex,0,1); pthread_create(&tid,NULL,thread,(void *)i); pthread_create(&tid1,NULL,thread1,(void *)i); pthread_join(tid,NULL); pthread_join(tid1,NULL); printf("cnt=%d ",cnt); return 0; /*exit(0);*/ }
3.模拟生产者和消费者
查看线程命令:ps xH|grep ./c| wc -l(ps xH显示所有线程,grep ./c筛选,wc -l计数)
/************************************************************************* > File Name: c.c > Author: bf > Mail: > Created Time: 2014年10月15日 星期三 19时03分20秒 ************************************************************************/ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<fcntl.h> #include<netinet/in.h> #include<arpa/inet.h> #include <pthread.h> #include <semaphore.h> int p(sem_t *s) { return sem_wait(s); } int v(sem_t *s) { return sem_post(s); } struct Node { int v; }; struct Buf { struct Node *buf; int len; int front,rear; sem_t mutex,slots,items; }; struct Buf buf; void buf_init(struct Buf *buf,int n) { buf->buf=(struct Node *)malloc(sizeof(struct Node)); buf->len=n; buf->front=buf->rear=0; sem_init(&buf->mutex,0,1); sem_init(&buf->slots,0,n); sem_init(&buf->items,0,0); } void buf_insert(struct Buf *buf,struct Node node) { p(&buf->slots); p(&buf->mutex); buf->buf[(++(buf->rear))%(buf->len)]=node; v(&buf->mutex); v(&buf->items); } struct Node buf_remove(struct Buf *buf) { struct Node item; p(&buf->items); p(&buf->mutex); item=buf->buf[(++(buf->front))%(buf->len)]; v(&buf->mutex); v(&buf->slots); return item; } void *pthread_get(void *vargp) { struct Node node=buf_remove(&buf); printf("IN get :%d ",node.v); } sem_t mutext; void *pthread_add(void *vargp) { struct Node node; static int value=0; p(&mutext); node.v=value++; v(&mutext); buf_insert(&buf,node); } int main() { int i,a; pthread_t tid[100]; int top=0; sem_init(&mutext,0,1); buf_init(&buf,3); while(scanf("%d",&a)!=EOF) { if(a==1) { pthread_create(&tid[top++],NULL,pthread_add,NULL); } else { pthread_create(&tid[top++],NULL,pthread_get,NULL); } } for( i=0;i<top;i++) { pthread_join(tid[i],NULL); } return 0; /*exit(0);*/ }
4.
读者写着问题一:读者优先
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<fcntl.h> #include<netinet/in.h> #include<arpa/inet.h> #include <pthread.h> #include <semaphore.h> int p(sem_t *s) { return sem_wait(s); } int v(sem_t *s) { return sem_post(s); } struct Node { int v; }; struct Node value; sem_t w,mutex; int cnt=0; void my_read() { p(&mutex); cnt++; if(cnt==1) { p(&w); } v(&mutex); sleep(1); printf("In read:value=%d ",value.v); p(&mutex); cnt--; if(cnt==0) { v(&w); } v(&mutex); } void my_write(struct Node node) { p(&w); value=node; v(&w); } void *pthread_read(void *vargp) { my_read(); } void *pthread_write(void *vargp) { int v=(int)vargp;//转成int struct Node node; node.v=v; my_write(node); } int main() { int i,a; pthread_t tid[100]; int top=0; sem_init(&mutex,0,1); sem_init(&w,0,1); value.v=0; while(scanf("%d",&a)!=EOF) { if(a==0) { pthread_create(&tid[top++],NULL,pthread_read,NULL); } else { pthread_create(&tid[top++],NULL,pthread_write,(void *)a);//转成指针的值 } } for( i=0;i<top;i++) { pthread_join(tid[i],NULL); } return 0; }
读者写着问题一:写者优先
/************************************************************************* > File Name: c.c > Author: bf > Mail: > Created Time: 2014年10月15日 星期三 19时03分20秒 ************************************************************************/ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<fcntl.h> #include<netinet/in.h> #include<arpa/inet.h> #include <pthread.h> #include <semaphore.h> int p(sem_t *s) { return sem_wait(s); } int v(sem_t *s) { return sem_post(s); } struct Node { int v; }; struct Node value; sem_t wmutex,rmutex,mutex1,mutex2; int cnt1=0,cnt2=0; void my_read() { p(&rmutex); p(&mutex1); cnt1++; if(cnt1==1) p(&wmutex); v(&mutex1); v(&rmutex); sleep(2); printf("In read :value=%d ",value.v); p(&mutex1); cnt1--; if(cnt1==0) v(&wmutex); v(&mutex1); } void my_write(struct Node node) { p(&mutex2); cnt2++; if(cnt2==1) p(&rmutex); v(&mutex2); p(&wmutex); sleep(2); value=node; printf("In write :value=%d ",value.v); v(&wmutex); p(&mutex2); cnt2--; if(cnt2==0) v(&rmutex); v(&mutex2); } void *pthread_read(void *vargp) { my_read(); } void *pthread_write(void *vargp) { int v=(int)vargp;//转成int struct Node node; node.v=v; my_write(node); } int main() { int i,a; pthread_t tid[100]; int top=0; sem_init(&mutex1,0,1); sem_init(&mutex2,0,1); sem_init(&wmutex,0,1); sem_init(&rmutex,0,1); value.v=0; while(scanf("%d",&a)!=EOF) { if(a==0) { pthread_create(&tid[top++],NULL,pthread_read,NULL); } else { pthread_create(&tid[top++],NULL,pthread_write,(void *)a);//转成指针的值 } } for( i=0;i<top;i++) { pthread_join(tid[i],NULL); } return 0; /*exit(0);*/ }