zoukankan      html  css  js  c++  java
  • 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
    ",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);*/
    }
  • 相关阅读:
    python核心编程(多线程编程)
    Python核心编程(网络编程)
    将非drf接口配置到swagger
    jmeter设置全局变量--通过正则表达式进行提取
    jmeter实现用户登录高并发
    Django跨关联关系查询
    python树状结构取值和加值
    chrome浏览器代理插件SwitchyOmega使用
    burp suite历程-安装burp suite
    django中对模型字段名的限制
  • 原文地址:https://www.cnblogs.com/sbaof/p/4044042.html
Copyright © 2011-2022 走看看