1,创建两个线程完成图片拷贝,一个线程拷贝一半。
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
typedef struct
{
int fr_r;
int fr_w;
long int size;
}duxie;
void *xianchanga(void* arg)
{
printf("%ld\n",((duxie*)arg)->size);
pthread_mutex_lock(&mutex);
//偏移量
lseek(((duxie*)arg)->fr_r,0,SEEK_SET);
lseek(((duxie*)arg)->fr_w,0,SEEK_SET);
//读写
for(int i=0;i<(((duxie*)arg)->size)/2;i++)
{
char a;
read(((duxie*)arg)->fr_r,&a,1);
write(((duxie*)arg)->fr_w,&a,1);
}
printf("前半部分打印完毕\n");
pthread_mutex_unlock(&mutex);
}
void *xianchangb(void* arg)
{
pthread_mutex_lock(&mutex);
//偏移量
lseek(((duxie*)arg)->fr_r,(((duxie*)arg)->size)/2,SEEK_SET);
lseek(((duxie*)arg)->fr_w,(((duxie*)arg)->size)/2,SEEK_SET);
//读写
for(int i=0;i<((duxie*)arg)->size/2+1;i++)
{
char a;
read(((duxie*)arg)->fr_r,&a,1);
write(((duxie*)arg)->fr_w,&a,1);
}
printf("后半部分打印完毕\n");
pthread_mutex_unlock(&mutex);
}
int main(int argc, const char *argv[])
{
duxie* pa=(duxie*)malloc(sizeof(duxie));
umask(0);
pa->fr_r=open("./1.png",O_RDONLY);
pa->fr_w=open("./cpy.png",O_WRONLY|O_CREAT|O_TRUNC,0777);
pa->size=lseek(pa->fr_r,0,SEEK_END);
pthread_t the;
int pth=pthread_create(&the,NULL,xianchanga,(void*)pa);
if(pth!=0)
{
printf("this is shibai\n");
return -1;
}
pthread_t the1;
int pth1=pthread_create(&the1,NULL,xianchangb,(void*)pa);
if(pth1!=0)
{
printf("this is shibai\n");
return -1;
}
pthread_join(the,NULL);
pthread_join(the1,NULL);
close(pa->fr_r);
close(pa->fr_w);
return 0;
}
运行结果
2,创建编号为ABC三个线程,三个线程循环打印自己的编号,要求打印出来的结果必须是ABC;
信号灯实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
#include <semaphore.h>
#define BUF_SIZE 8
char charbuf[BUF_SIZE] = "1234567";
sem_t sem1,sem2,sem3;
// A线程的函数
void *thread_A(void *arg) {
while (1) {
//临界区
//p操作
sem_wait(&sem1);
printf("A\n");
//v操作
sem_post(&sem2);
//临界区//
}
return NULL;
}
// B线程的函数
void *thread_B(void *arg) {
while (1) {
临界区/
//p操作
sem_wait(&sem2);
printf("B\n");
//v操作
sem_post(&sem3);
临界区///
}
return NULL;
}
//C线程函数
void *thread_C(void *arg)
{
while(1)
{
临界区
//P操作
sem_wait(&sem3);
printf("C\n");
//v操作
sem_post(&sem1);
临界区/
}
}
int main(int argc, const char *argv[])
{
//创建信号灯
sem_init(&sem1,0,1);
sem_init(&sem2,0,0);
sem_init(&sem3,0,0);
pthread_t thread_a, thread_b,thread_c;
// 创建A线程
if (pthread_create(&thread_a, NULL, thread_A,NULL) != 0) {
fprintf(stderr, "Error creating thread A\n");
return 1;
}
// 创建B线程
if (pthread_create(&thread_b, NULL, thread_B, NULL) != 0) {
fprintf(stderr, "Error creating thread B\n");
return 1;
}
//创建C线程
if (pthread_create(&thread_c, NULL, thread_C, NULL) != 0) {
fprintf(stderr, "Error creating thread B\n");
return 1;
}
pthread_join(thread_a,NULL);
pthread_join(thread_b,NULL);
pthread_join(thread_c,NULL);
//接触信号灯
sem_destroy(&sem1);
sem_destroy(&sem2);
return 0;
}
3,无名管道(pipe)
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
int main(int argc, const char *argv[])
{
//创建无名管道
int pd[2];
if(pipe(pd)<0)
{
perror("pipe");
return -1;
}
char buff[128]="";
pid_t pid=fork();
if(pid>0)
{
while(1)
{
fgets(buff,sizeof(buff),stdin);
buff[strlen(buff)-1]='\0';
//strcpy(buff,"hello");
//父进程
write(pd[1],buff,sizeof(buff));
printf("写入成功:%s__%d\n",buff,__LINE__);
}
}
else if(pid==0)
{
while(1)
{
//子进程
read(pd[0],buff,sizeof(buff));
printf("成功读出:%s __%d\n",buff,__LINE__);
sleep(1);
}
}
else
{
perror("fork");
return -1;
}
return 0;
}