c++多线程(《深入理解计算机……》)

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\n",cnt++);
    }
    pthread_t id=pthread_self();
    printf("id=%u\n",(unsigned int)id);
    printf("cnt=%d\n",cnt);
    return NULL;
}
void *thread1(void *vargp)
{
    pthread_detach(pthread_self());
    int i=0;
    for(;i<3;i++)
    printf("pthread1\n");
    for(i=0;i<3;i++)
    cnt++;
    printf("cnt=%d\n",cnt);
    return 0;
    /*exit(0);*/
}
void *thread2(void *vargp)
{
    pthread_detach(pthread_self());
    int i=0;
    for(;i<3;i++)
    printf("pthread2\n");
    for(i=0;i<3;i++)
    cnt++;
    printf("cnt=%d\n",cnt);
    return 0;
    /*exit(0);*/
}
void *thread3(void *vargp)
{
    pthread_detach(pthread_self());
    int i=0;
    for(;i<3;i++)
    printf("pthread3\n");
    for(i=0;i<3;i++)
    cnt++;
    printf("cnt=%d\n",cnt);
    return 0;
    /*exit(0);*/
}
int main()
{
    /*printf("In main()\n");*/
    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\n",cnt++);
    }

    pthread_t id=pthread_self();
    printf("id=%u\n",(unsigned int)id);

/*    
    pthread_join(tid,NULL);
    pthread_join(tid1,NULL);
    pthread_join(tid2,NULL);
    pthread_join(tid3,NULL);
*/
    printf("cnt=%d\n",cnt);
    /*printf("In main3\n");*/
    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\n",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\n",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\n",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\n",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\n",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);*/
}

 

posted @ 2014-10-22 18:43  baoff  阅读(262)  评论(0编辑  收藏  举报