进程与线程 day2

思维导图

进程与线程 day2_第1张图片

进程与线程 day2_第2张图片

三个线程实现文件拷贝

#include

sem_t sem;

//定义用来传递数据的结构体
typedef struct
{
        int src;
        int dst;
        int len;
}CopyInfo;

/*
 * function:    按给定的位置和大小拷贝文件
 * @param [ in] 源文件描述符 目的文件描述符 拷贝起始位置 拷贝大小
 * @param [out]
 * @return
 */
int copy_file(int srcfd,int dstfd,int start,int len)
{

        lseek(srcfd,start,SEEK_SET);
        lseek(dstfd,start,SEEK_SET);

        char buf[128]="";
        int res=0;
        int sum=0;

        while(1)
        {
                res=read(srcfd,buf,sizeof(buf));
                sum+=res;
                if(sum>=len || res==0)
                {
                        write(dstfd,buf,res-(sum-len));
                        break;
                }
                write(dstfd,buf,res);
        }
}

/*
 * function:    线程1拷贝前半部分内容
 * @param [ in]
 * @param [out]
 * @return
 */
void *task1(void *arg)
{
        CopyInfo *info=(CopyInfo *)arg;
        copy_file(info->src,info->dst,0,(info->len)/2);
        sem_post(&sem);
}

/*
 * function:    线程2拷贝后半部分内容
 * @param [ in]
 * @param [out]
 * @return
 */
void *task2(void *arg)
{
        CopyInfo *info=(CopyInfo *)arg;
        copy_file(info->src,info->dst,(info->len)/2,(info->len)-(info->len)/2);
        sem_wait(&sem);
}

int main(int argc, const char *argv[])
{
        int srcfd,dstfd;
    //打开两个文件
        srcfd=open(argv[1],O_RDONLY);
        if(srcfd==-1)
        {
                perror("open srcfile error");
                return -1;
        }

        dstfd=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0664);
        if(dstfd==-1)
        {
                perror("open dstfile error");
                return -1;
        }

        //获取文件大小
        int len=lseek(srcfd,0,SEEK_END);

        //创建两个线程
        pthread_t tid1,tid2;

        CopyInfo info;
        info.src=srcfd;
        info.dst=dstfd;
        info.len=len;

        if(pthread_create(&tid1,NULL,task1,(void *)&info)!=0)
        {
                perror("create task1 error");
                return -1;
        }

        if(pthread_create(&tid2,NULL,task2,(void *)&info)!=0)
        {
                perror("create task2 error");
                return -1;
        }

        //等待线程完成
        pthread_join(tid1,NULL);
        pthread_join(tid2,NULL);

        close(srcfd);
        close(dstfd);

        printf("DONE!");

        sem_destroy(&sem);

        return 0;
}

三个线程打印ABC

#include

sem_t sem1;
sem_t sem2;

void *task1(void *arg)    //线程1打印A
{
        while(1)
        {
                sleep(1);

                printf("A\n");

                sem_post(&sem1);
        }
}

void *task2(void *arg)    //线程2打印B
{
        while(1)
        {
                sem_wait(&sem1);

                printf("B\n");

                sem_post(&sem2);
        }
}

void *task3(void *arg)    //线程3打印C
{
        while(1)
        {
                sem_wait(&sem2);

                printf("C\n");
        }
}

int main(int argc, const char *argv[])
{


        pthread_t tid1,tid2,tid3;

        if(pthread_create(&tid1,NULL,task1,NULL)!=0)
        {
                perror("create task1 error");
                return -1;
        }

        if(pthread_create(&tid2,NULL,task2,NULL)!=0)
        {
                perror("create task2 error");
                return -1;
        }

        if(pthread_create(&tid3,NULL,task3,NULL)!=0)
        {
                perror("create task3 error");
                return -1;
        }

        pthread_join(tid1,NULL);
        pthread_join(tid2,NULL);
        pthread_join(tid3,NULL);

        sem_destroy(&sem1);
        sem_destroy(&sem2);

        return 0;
}

你可能感兴趣的:(java,算法,linux)