1)创建两个线程A、B,以及一个全局变量char str[] = "123456",在不考虑线程退出的情况下,
要求如下:(必须上交)
1. A
线程 循环 打印
str
字符串。
2. B
线程 循环 倒置
str
字符串,不使用辅助数组。注意是循环倒置,要把字符串倒过来,倒回
去。
3.
要求
A
线程打印出来的结果是有序的,例如:
"123456"
或者
"654321"
,不允许出
现
"623451",,,
等无序情况
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<pthread.h>
#include<unistd.h>
#include<semaphore.h>
char str[]="aaaaaakkkkkk";
void *callbacka(void* arg)
{
while(1)
{
//P操作
if(sem_wait((sem_t*)arg)<0)
{
perror("sem_wait");
return NULL;
}
// printf("P operation success %d\n",__LINE__);
printf("%s\n",str);
//V操作
if(sem_post((sem_t*)arg)<0)
{
perror("sem_post");
}
// printf("V operation success %d\n",__LINE__);
}
pthread_exit(NULL);
}
void *callbackb(void* arg)
{
int len = strlen(str);
while(1)
{
//P操作
if(sem_wait((sem_t*)arg)<0)
{
perror("sem_wait");
return NULL;
}
// printf("P operation success %d\n",__LINE__);
for(int i=0;i<len/2;i++)
{
char temp = str[i];
str[i]=str[len-1-i];
str[len-1-i]=temp;
}
//V操作
if(sem_post((sem_t*)arg)<0)
{
perror("sem_post");
}
// printf("V operation success %d\n",__LINE__);
}
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
printf("主线程\n");
//创建一个信号量
sem_t sem;
if(sem_init(&sem,0,1)<0)
{
perror("sem_init");
return -1;
}
printf("信号量创建成功%d\n",__LINE__);
pthread_t tid1;
if(pthread_create(&tid1,NULL,callbacka,(void*)&sem)!=0)
{
perror("pthread_creat");
return -1;
}
printf("分支a线程创建成功\n");
pthread_t tid2;
if(pthread_create(&tid2,NULL,callbackb,(void*)&sem)!=0)
{
perror("pthread_creatb");
return -2;
}
printf("分支b线程创建成功\n");
pthread_join(tid1,NULL);
pthread_join(tid1,NULL);
//销毁信号量
if(sem_destroy(&sem)<0)
{
perror("sem_destory");
return -1;
}
return 0;
}
2)两个线程 A、B,要求A线程读取文件中的数据,B线程将读取到的数据打印到终端上。类似cat一个文件。(选做)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<pthread.h>
#include<unistd.h>
#include<semaphore.h>
char buf[100];
int res;
struct msg
{
sem_t sem;
int fd_r;
};
void *callbacka(void* arg)
{
struct msg* info = (struct msg*)arg;
sem_t sem=info->sem;
int fd_r=info->fd_r;
while(1)
{
//P操作
if(sem_wait(&sem)<0)
{
perror("sem_wait");
return NULL;
}
res = read(fd_r,buf,1);
printf("e%s",buf);
if(res<0)
{
perror("read");
return NULL;
}
else if(0==res)
{
break;
}
//V操作
if(sem_post(&sem)<0)
{
perror("sem_post");
}
}
pthread_exit(NULL);
}
void *callbackb(void* arg)
{
struct msg* info = (struct msg*)arg;
sem_t sem=info->sem;
int fd_r=info->fd_r;
while(1)
{
//P操作
if(sem_wait(&sem)<0)
{
perror("sem_wait");
return NULL;
}
if(strlen(buf)!=0)
{
printf("%s",buf);
}
else
{
break;
}
//V操作
if(sem_post(&sem)<0)
{
perror("sem_post");
}
}
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
printf("主线程\n");
//创建一个信号量
sem_t sem;
if(sem_init(&sem,0,1)<0)
{
perror("sem_init");
return -1;
}
printf("信号量创建成功%d\n",__LINE__);
int fd_r = open("./2.txt",O_RDONLY);
if(fd_r<0)
{
perror("openr");
return -1;
}
struct msg info;
info.sem=sem;
info.fd_r=fd_r;
pthread_t tid1;
if(pthread_create(&tid1,NULL,callbacka,(void*)&info)!=0)
{
perror("pthread_creat");
return -1;
}
printf("分支a线程创建成功\n");
pthread_t tid2;
if(pthread_create(&tid2,NULL,callbackb,(void*)&info)!=0)
{
perror("pthread_creatb");
return -2;
}
printf("分支b线程创建成功\n");
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
//销毁信号量
if(sem_destroy(&sem)<0)
{
perror("sem_destory");
return -1;
}
return 0;
}