1. 要求创建两个线程,以及一个全局变量,char str[] = "123456";要求如下:
1
)一个线程专门用于打印
str;
2
)另外一个线程专门用于倒置
str
字符串,不使用辅助数组。
3
)要求打印出来的结果必须是
123456
或者
654321
,不能出现乱序情况,例如
623451 653421
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>
void *print_str(void *p)
{
while(*(char*)p!='\0')
printf("%c ",*(char*)p++);
printf("\n");
}
void *reverse(void *p)
{
int l=strlen((char*)p);
int head=0,tail=l-1;
char temp;
while(head<tail){
temp=((char*)p)[head];
((char*)p)[head]=((char*)p)[tail];
((char*)p)[tail]=temp;
head++;
tail--;
}
for(int i=0;i<l;i++)
printf("%c ",((char*)p)[i]);
printf("\n");
}
int main(int argc, const char *argv[])
{
char str[]="123456";
pthread_t p,t;
if(pthread_create(&t,NULL,reverse,(void *)str)!=0){
perror("pthread_create");
return -1;
}
if(pthread_create(&p,NULL,print_str,(void *)str)!=0){
perror("pthread_create");
return -1;
}
sleep(1);
return 0;
}
2. 要求用线程拷贝一张图片,一个线程拷贝前半部分,另一个线程拷贝后半部分
代码如下:
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
void *print_str(void *p)
{
lseek(((int*)p)[0],((int*)p)[2],SEEK_SET);
lseek(((int*)p)[1],((int*)p)[2],SEEK_SET);
char c;
for(int i=0;i<((int*)p)[2]+((int*)p)[3];i++){
read(((int*)p)[0],&c,1);
write(((int*)p)[1],&c,1);
}
}
void *reverse(void *p)
{
sleep(1);
lseek(((int*)p)[0],0,SEEK_SET);
lseek(((int*)p)[1],0,SEEK_SET);
char c;
for(int i=0;i<((int*)p)[2];i++){
read(((int*)p)[0],&c,1);
write(((int*)p)[1],&c,1);
}
}
int main(int argc, const char *argv[])
{
int fd_r = open("./1.png", O_RDONLY);
if(fd_r < 0)
{
perror("open");
return -1;
}
int fd_w = open("./2.png", O_WRONLY|O_CREAT|O_TRUNC, 0664);
if(fd_w < 0)
{
perror("open");
return -1;
}
struct stat pstat;
if(stat("./1.png", &pstat) < 0)
{
perror("stat");
return -1;
}
off_t size = pstat.st_size;
printf("size=%ld\n", size);
off_t half_size = size/2;
int flag = size%2;
int arr[10];
pthread_t p,t;
if(pthread_create(&t,NULL,reverse,(void *)arr)!=0){
perror("pthread_create");
return -1;
}
if(pthread_create(&p,NULL,print_str,(void *)arr)!=0){
perror("pthread_create");
return -1;
}
arr[0]=fd_r;
arr[1]=fd_w;
arr[2]=half_size;
arr[3]=flag;
sleep(2);
return 0;
}