IO第4天

用信号量的方式实现循环倒置和打印,要求倒置一次,打印一次。不允许使用flag

使用信号量来控制运行顺序:两个信号仓共用一个信号量,A信号仓用完了给B用

#include 
sem_t sid1,sid2;
char arr[]="1234567";

void* pthreadA(void* arg) //void* arg=&sid
{
    while(1){
        //-1 P操作
        if(sem_wait(&sid1)<0){
            perror("sem_wait");
            pthread_exit(NULL);
        }

        printf("%s\n",arr);

        //+1 V操作
        if(sem_post(&sid2)<0){
            perror("sem_wait");
            pthread_exit(NULL);
        }
    }
    pthread_exit(NULL);
}

void* pthreadB(void* arg) //void* arg=&sid
{
    while(1){
        //-1 P操作
        if(sem_wait(&sid2)<0){
            perror("sem_wait");
            pthread_exit(NULL);                         
        }

        char temp;
        for(int i=0,j=strlen(arr)-1;i

完成图片拷贝,要求一个线程拷贝一半,另一个线程拷贝另一半。
提示:找临界资源,找临界区,对临界区上锁解锁即可

#include 

#define muid pthread_mutex_t

struct stat statbuf;
int pid_r,pid_w;
pthread_mutex_t mutex;


//上半部分
void* pthreadA(void* arg){ //void* arg=&mutex
	
	//上锁
	pthread_mutex_lock(&mutex);

	//重置读取位置
	lseek(pid_r,0,SEEK_SET);
	
	//重置写入位置
	lseek(pid_w,0,SEEK_SET);

	//写入前半部分
	char str;
	for(int i=0;i

遇到的问题:1、运算符优先级:=的优先级最低,需要括起来再进行比较运算

2、同一个写入文件,用了打开清空就不能再在另一个线程打开清空了,最好写主函数里

3、for循环的循环头括号后面如果加“;”,那么这个for循环只会运行一次

创建两个线程,要求一个线程从文件中读取数据,另一个线程将读取到的数据打印到终端,类似cat一个文件。文件cat完毕后,要结束进程
提示:读到一次数据,打印一次数据

#include 
sem_t sid1,sid2;
FILE* pid;
char buf;
struct stat statbuf;

void* pthreadA(void* arg){
	printf("size:%d\n",statbuf.st_size);
	int i=0;
	while(i

只要while循环体没结束,就会一直按照顺序读写,直到满足条件退出

你可能感兴趣的:(IO,算法,java,数据结构)