• pthread


    线程对于共享资源不安全,线程拥有各自的栈空间.
    主动终止:  return  pthread_eixt()参数通用指针
    被动终止: pthread_cancle(pthid);同一个进程的其他线程
    
    
    exit(0)  _exit(0)  进程终止
    
    
    pthread_join(pthread_t th_id,void **thread_return);
    阻塞 ,等待子线程结束,并且释放资源
    参数2 等待线程返回值(  return(0) pthread_exit(0)
    
    
    
    
    
    
    
    
    #include<stdlib.h>
    #include <pthread.h>
    #include <stdio.h>
    #include <math.h>
    typedef struct
    {
        char name[20];
        int time;
        int start;
        int end;
    }ReacArg;
    
    
    //线程函数
    void* th_fn(void *arg)
    {
        ReacArg *r = (ReacArg*)arg;
        int i=r->start;
        for(;i<=r->end;i++)
        {
            printf("%s(%lx) run %d
    ",r->name,pthread_self(),i);
    
    
            usleep(r->time);//微妙
        }
    
    
        return (void*)0;
    }
    int main()
    {
    
    
        int err ;
        //创建创建线程rabbit
        pthread_t rabbit ,turtle;
        ReacArg r_a={"rabbit",(int)(drand48()*100000),20,50};
        ReacArg t_a={"turtle",(int)(drand48()*1000),20,50};
    
    
        if((err = pthread_create(&rabbit,NULL,th_fn,(void*)&r_a))!=0)
        {
    
    
            perror("pthread_create error");
        }
        //创建线程turtle   第四个参数 结构体
        if((err = pthread_create(&turtle,NULL,th_fn,(void*)&t_a))!=0)
        {
    
    
            perror("pthread_create error");
        }
        pthread_join(rabbit,NULL);
        pthread_join(turtle,NULL);
    
    
        printf("contrl thread id: %lx",pthread_self());
        printf("finished
    ");
    return 0;
    
    
    }
    
    
    
    
    #include<stdlib.h>
    #include <pthread.h>
    #include <stdio.h>
    typedef struct
    {
        int d1;
        int d2;
    
    
    }Arg;
    
    
    void *th_fn(void* arg)
    {
    
    
        Arg *r = (Arg*)arg;
        return (void*)r;
    
    
    }
    
    
    int main(void)
    {
    
    
        int err;
        //int *result;  //接受返回值
    
    
        pthread_t th;
    
    
        printf("%lx
    ",sizeof(enum type));
        Arg r={30,50};
        if((err = pthread_create(&th,NULL,th_fn,(void*)&r))!=0)
        {
            perror("create erro
    ");
    
    
        }
    //    pthread_join(th,(void**)&result);
    //   printf("获得结果:%d
    ",((Arg*)result)->d1);
    int re;
    pthread_join(th,(void*)&re);
    printf("获得结果:%d
    ",((Arg*)re)->d1);
        return 0;
    }
    //定义结构体(多个对象需要同样的处理)  开启线程(处理)    返回结果
    
    
    主要用到的函数:
    sem_t sem;
    
    
    int sem_init(sem_t *sem, int pshared, unsigned int value);,其中sem是要初始化的信号量,pshared表示此信号量是在进程间共享还是线程间共享,value是信号量的初始值。
    int sem_destroy(sem_t *sem);,其中sem是要销毁的信号量。只有用sem_init初始化的信号量才能用sem_destroy销毁。
    int sem_wait(sem_t *sem);等待信号量,如果信号量的值大于0,将信号量的值减1,立即返回。如果信号量的值为0,则线程阻塞。相当于P操作。成功返回0,失败返回-1。
    int sem_post(sem_t *sem); 释放信号量,让信号量的值加1。相当于V操作。
    
    
    
    
    
    
    #include <pthread.h>
    #include <semaphore.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    
    将信号量定义为全局变量,方便多个线程共享
    sem_t sem;
    
    
    
    
    void * get_service(void *thread_id)
    {
        int customer_id = *((int *)thread_id);
    
    
        if(sem_wait(&sem) == 0) {
            usleep(100);                 service time: 100ms
            printf("customer %d receive service ...id:%ld
    ", customer_id,getpid());
            printf("l%d
    ",pthread_self());
            sem_post(&sem);
        }
    }
    
    
    #define CUSTOMER_NUM 10
    
    
    int main(int argc, char *argv[])
    {
         初始化信号量,初始值为2,表示有两个顾客可以同时接收服务
    
    
        sem_init(&sem, 0, 2);
    
    
    
    
        pthread_t customers[CUSTOMER_NUM];
    
    
        int i, ret;
    
    
        for(i = 0; i < CUSTOMER_NUM; i++){
            int customer_id = i;
            ret = pthread_create(&customers[i], NULL, get_service, &customer_id);
            if(ret != 0){
                perror("pthread_create");
                exit(1);
            }
            else {
                printf("Customer %d arrived.
    ", i);
            }
            usleep(10);
        }
    
    
    
    
        int j;
        for(j = 0; j < CUSTOMER_NUM; j++) {
            pthread_join(customers[j], NULL);
        }
    
    
        sem_destroy(&sem);
        return 0;
    }
    */
  • 相关阅读:
    iOS 8以后 定位手动授权问题
    IOS int NSInteger NSNumber区分
    Java基础知识(JAVA集合框架之List与Set)
    Java基础知识(JAVA基本数据类型包装类)
    Java基础知识(JAVA中String、StringBuffer、StringBuilder类的区别)
    Java基础知识(重载和覆盖)
    Java基础知识(抽象类和接口)
    host文件
    天猫页面显示错位
    专题8:javascript函数详解
  • 原文地址:https://www.cnblogs.com/countryboy666/p/10974314.html
Copyright © 2020-2023  润新知