多线程复制程序的求解
来源:互联网 发布:手机时时彩看号软件 编辑:程序博客网 时间:2024/06/05 14:29
cp_thread_mutex.c:98: 警告:传递‘pthread_mutex_destroy’的第 1 个参数时在不兼容的指针类型间转换
/usr/include/pthread.h:738: 附注:需要类型‘union pthread_mutex_t ’,但实参的类型为‘union pthread_mutex_t **’
cp_thread_mutex.c: 在函数‘reader’中:
cp_thread_mutex.c:116: 警告:传递‘pthread_mutex_lock’的第 1 个参数时在不兼容的指针类型间转换
/usr/include/pthread.h:746: 附注:需要类型‘union pthread_mutex_t ’,但实参的类型为‘union pthread_mutex_t *’
cp_thread_mutex.c:128: 警告:传递‘pthread_mutex_unlock’的第 1 个参数时在不兼容的指针类型间转换
/usr/include/pthread.h:757: 附注:需要类型‘union pthread_mutex_t ’,但实参的类型为‘union pthread_mutex_t *’
cp_thread_mutex.c: 在函数‘writer’中:
cp_thread_mutex.c:152: 警告:传递‘pthread_mutex_lock’的第 1 个参数时在不兼容的指针类型间转换
/usr/include/pthread.h:746: 附注:需要类型‘union pthread_mutex_t ’,但实参的类型为‘union pthread_mutex_t *’
cp_thread_mutex.c:164: 警告:传递‘pthread_mutex_unlock’的第 1 个参数时在不兼容的指针类型间转换
/usr/include/pthread.h:757: 附注:需要类型‘union pthread_mutex_t ’,但实参的类型为‘union pthread_mutex_t *’
下面是代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <pthread.h>
#include <dirent.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <time.h>
//#include "cp_header.h"
#define BUFFER_SIZE 5
#define THREAD_BUFFER_SIZE 1024
struct prodcons
{
char** buffer;
pthread_mutex_t** lock;
int infd,outfd;
int read_bytes,write_bytes;
int thread_file_size;
int* num;
//pthread_cond_t notempty;
//pthread_cond_t notfull;
};
size_t get_filesize(int fd)
{
struct stat st;
fstat(fd,&st);
return st.st_size;
}
void *reader(void *arg1);
void *writer(void *arg2);
int main(int argc,char *argv[])
{
int infd,outfd;
int k=0;
int res;
pthread_t th_a,th_b;
if(argc!=3) {
exit(1);
}
infd=open(argv[1],O_RDONLY);
outfd=open(argv[2],O_CREAT|O_WRONLY,0644);
if(infd==-1||outfd==-1)
{
printf("fail to open\n");
return -1;
}
else {
printf("open success!!!!!\n");
}
size_t file_size=get_filesize(infd);
printf("file size is %d\n",file_size);
struct prodcons *b=(struct prodcons *) malloc(BUFFER_SIZE*sizeof(struct prodcons));
for(int i=0;i<BUFFER_SIZE;i++)
{
b->lock[i]=(pthread_mutex_t*)malloc(sizeof(pthread_mutex_t));
res=pthread_mutex_init(b->lock[i],NULL);
b->buffer[i]=(char*)malloc(THREAD_BUFFER_SIZE*BUFFER_SIZE);
b->num[i]=0;
}
b->infd=infd;
b->outfd=outfd;
b->thread_file_size=file_size;
printf("file_size is %d\n",b->thread_file_size);
//pthread_mutex_init(&b->lock, NULL);
//pthread_cond_init(&b->notempty,NULL);
//pthread_cond_init(&b->notfull,NULL);
//b->read_bytes=0;
//b->write_bytes=0;
pthread_create(&th_a,NULL,reader,(void *)b);
pthread_create(&th_b,NULL,writer,(void *)b);
pthread_join(th_a,NULL);
pthread_join(th_b,NULL);
free(b);
for(int i=0;i<BUFFER_SIZE;i++)
{
free(b->lock[i]);
free(b->buffer[i]);
}
close(infd);
close(outfd);
for(int i=0;i<BUFFER_SIZE;i++) {
pthread_mutex_destroy(&b->lock);
}
return 0;
}
void *reader(void *arg1)
{
//int read_bytes;
int i=0;
static int count=0;
int ret;
//char buffer[THREAD_BUFFER_SIZE];
struct prodcons *b=(struct prodcons *)arg1;
while(count<b->thread_file_size) {
//pthread_mutex_lock(&b->lock);
for(i=1;i<BUFFER_SIZE;i++) {
pthread_mutex_lock(&b->lock[i]);
b->read_bytes=read(b->infd,b->buffer[i],THREAD_BUFFER_SIZE);
if((b->read_bytes==-1)&&(errno!=EINTR)) {
printf("fail to read\n");
break;
}
else if(b->read_bytes>0) {
b->num[i]=b->read_bytes;
count+=b->read_bytes;
i++;
printf("read_bytes is %d\n",b->num[i]);
}
pthread_mutex_unlock(&b->lock[i]);
sleep(1);
}
if (i>=BUFFER_SIZE) {
i=0;
}
}
/* pthread_mutex_unlock(&b->lock);*/
}
void *writer(void *arg2)
{
struct prodcons *b=(struct prodcons *)arg2;
//char buffer[THREAD_BUFFER_SIZE];
//int write_bytes,data;
int i=0;
int ret1;
static int count1=0;
while(count1<b->thread_file_size) {
//pthread_mutex_lock(&b->lock);
for(i=0;i<BUFFER_SIZE;i++) {
if(count1<b->thread_file_size) {
pthread_mutex_lock(&b->lock[i]);
//data=buffer;
b->write_bytes=write(b->outfd,b->buffer[i],b->num[i]);
if((b->write_bytes==-1)&&(errno!=EINTR)) {
break;
}
else if(b->write_bytes>0) {
count1+=b->write_bytes;
i++;
printf("write_bytes is %d\n",b->write_bytes);
}
pthread_mutex_unlock(&b->lock[i]);
sleep(1);
}
else {
break;
}
//pthread_mutex_unlock(&b->lock);
//sleep(1);
}
if(i>=BUFFER_SIZE) {
i=1;
}
/*if(pthread_mutex_unlock(&b->lock)!=0) {
perror("pthread_mutex_unlock");
}
else {
printf("pthread2 unlock the variable\n");
}
sleep(1);*/
//pthread_mutex_destroy(&b->lock);
}
/*pthread_cond_signal(&b->notfull);*/
/*pthread_mutex_unlock(&b->lock);*/
}
- 多线程复制程序的求解
- 素数的求解程序
- 多线程文件复制程序(4个线程)
- RandomAccessFile 多线程的文件复制
- 递归程序求解问题的通用法则
- 堆栈的应用--迷宫求解程序
- 求解下列程序的错误所在
- 数独(sudoku)游戏的程序求解
- 用栈来是实现表达式求解的小程序
- 约瑟夫问题的笨方法求解程序
- Matlab 求解数独的程序
- 【基于java的九宫格求解程序】
- 2!,6!,8!的求解简单程序
- python程序的自我复制
- 多线程程序的建立
- 多线程程序的调试
- 简单的多线程程序
- 多线程的死锁程序
- oracle(二) tns配置
- 年终项目--大银行又来了(让我想起了用E语言编程的日子)
- UNIX网络编程——为每个客户现场分派一个线程(简单示例参考)
- log4j配置祥解
- Python、Lua和Ruby之优劣
- 多线程复制程序的求解
- Wireshark基本介绍和学习TCP三次握手
- 使用Java自带API MD5算法
- 心情의 組織 (心情은 天性에서 發한다)(韓長庚 易學原理總論)
- 移动开发的工具和战略
- NSArray、NSMutableArray-OC+class
- WCF 回调
- cocos2dx之CCEditBox
- JS事件绑定