第一次写多线程,大致地写个载入模块,请大家指正

hyq1986 2010-04-27 09:37:38
加精

// Loader.h
#ifndef LOADER_H
#define LOADER_H

extern "C" {

typedef struct LoadRequest_ LoadRequest;

LoadRequest*SendRequest(char* filename);
void ReleaseRequest(LoadRequest* request);
void* GetData(LoadRequest* request);
bool IsReady(LoadRequest* request);
bool IsError(LoadRequest* request);

}//extern "C"

#endif//LOADER_H



// Loader.cpp
#include "Loader.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <pthread.h>

extern "C" {

typedef enum RequestState_ {
LOADING,
READY,
ERROR,
} RequestState;

typedef struct Request_ {
RequestState stat;
char filename[512];
void* data;
} Request;

void* load_func_(void* arg) {
assert(arg);
Request* req = (Request*)arg;
FILE* fp = fopen(req->filename, "r");
if( !fp ) req->stat = ERROR;
else {
fseek(fp, 0, SEEK_END);
int len = ftell(fp);
req->data = malloc(len);
if( !(req->data) ) req->stat = ERROR;
else {
fseek(fp, 0, SEEK_SET);
fread(req->data, len, 1, fp);
req->stat = READY;
}
fclose(fp);
}
return 0;
}

LoadRequest* SendRequest(char* filename) {
pthread_t t;
Request* req = (Request*)malloc(sizeof(Request));
if(!req) return 0;
req->stat = LOADING;
strcpy(req->filename, filename);
pthread_create(&t, 0, load_func_, req);
return (LoadRequest*)req;
}

void ReleaseRequest(LoadRequest* request) {
assert(request);
Request* req = (Request*)request;
assert(req->stat==READY);
free(req->data);
free(req);
}

void* GetData(LoadRequest* request) {
assert(request);
Request* req = (Request*)request;
if( req->stat != READY ) return 0;
return req->data;
}

bool IsReady(LoadRequest* request) {
assert(request);
Request* req = (Request*)request;
return (req->stat==READY);
}

bool IsError(LoadRequest* request) {
assert(request);
Request* req = (Request*)request;
return (req->stat==ERROR);
}

}//extern "C"



// Main.cpp
#include <stdio.h>
#include "Loader.h"

int main(void) {
LoadRequest* req = SendRequest("test.txt");
while( !IsReady(req) ) {
if( IsError(req) ) {
printf("Error!\n");
break;
}
printf("Loading...\n");
}
if( IsReady(req) ) {
printf("Ready!\nThe text is:%s\n", (char*)GetData(req));
}
return 0;
}


编译运行不在话下:
$ g++ Loader.cpp Main.cpp -o MLLoader
$ ./MTLoader
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Ready!
The text is:Hello! Multithreading loader.

暂时没出现错误。
但是我想知道,我这么写,可能有哪些潜在错误。或者怎样写更好。
请大家指点一二。

先谢过!:)
...全文
1840 167 打赏 收藏 转发到动态 举报
写回复
用AI写文章
167 条回复
切换为时间正序
请发表友善的回复…
发表回复
kenycheng 2010-06-17
  • 打赏
  • 举报
回复
我也在学习中。感谢楼主帮问这样的问题。
daihua_1113 2010-06-09
  • 打赏
  • 举报
回复
期待中……
hyq1986 2010-06-04
  • 打赏
  • 举报
回复
抱歉,很久没登CSDN,所以不知道这贴这么多人回复。
我搞这个,主要是想弄出一个用于游戏的多线程动态异步载入的东西。
所以,效率不是我追求的,而且我现在也没能力追求多线程下的效率。
锁似乎是个容易出错的东西,我不太懂用锁,所以就想写个不用锁的。
原帖应该是有不少问题的,运行没发现错,不代表它没错。
所以千万别拿我这个新手瞎搞的东西用在你们的项目上,不然就罪过了。
后来,我又想了一个思路。比这个靠谱一些,但也没被别人审核过。
新的代码不知道丢哪了,以后再贴吧。
ghy009 2010-05-27
  • 打赏
  • 举报
回复
。。。没有进展啊
memeng2003 2010-05-27
  • 打赏
  • 举报
回复
[Quote=引用 162 楼 chuaimeng 的回复:]
LZ果然牛人!

我收回前面说过的话。
[/Quote]
? 为什么收回?


HuangTao_xa 说的没错啊。

lz编码功夫很扎实,写的不错。

但从多线程角度(我用的windows,当linux应该也会有相关东东吧),同步不好,没信号量,没互斥,没等待,没线程切换,恢复等。。。

不过作为初学,第一写出这样的程序基础应该很好了。


激情的头发 2010-05-20
  • 打赏
  • 举报
回复
LZ编程功底果然很扎实,似乎是个C++程序员。

细读代码,感觉,LZ的精力是在C/C++语法上,而非代码的实用性。

不过话说回来,从这段代码,向LZ学到很多东西呢。

感谢LZ的分享!
激情的头发 2010-05-20
  • 打赏
  • 举报
回复
[Quote=引用 151 楼 huangtao_xa 的回复:]
做为一个练习,楼主这么做是没有问题的。
但真正编程,这么做只增加了程序复杂度,没有提高效率。

因为两个线程一个做事,另一个在完全等待,实际做事还是串行的。两个完全串行的代码,在一个程序里完成不是更简单?
[/Quote]

我也对这个封装的实用性有所怀疑。想向LZ请教一下,这个做法的初衷是什么?它在怎样的环境下能体现出优势?
激情的头发 2010-05-20
  • 打赏
  • 举报
回复
LZ果然牛人!

我收回前面说过的话。
ym8262 2010-05-11
  • 打赏
  • 举报
回复
路过,呵呵
tianyi0212 2010-05-11
  • 打赏
  • 举报
回复
先顶了,再细看!
thyman 2010-05-11
  • 打赏
  • 举报
回复
顶!!!
qianwangen 2010-05-10
  • 打赏
  • 举报
回复
路过的看看
逍遥三少 2010-05-10
  • 打赏
  • 举报
回复
看不懂。。 杯具~
liujh1985 2010-05-10
  • 打赏
  • 举报
回复
没有注释,详细点。对我们新手更有用。
还是谢谢了。
sleetqaz 2010-05-10
  • 打赏
  • 举报
回复
都是高手啊...
lillian0820 2010-05-10
  • 打赏
  • 举报
回复
来学习一下。
haohaizibuaixuexi 2010-05-10
  • 打赏
  • 举报
回复
好评!
神之泪花 2010-05-10
  • 打赏
  • 举报
回复
春之晓者 2010-05-10
  • 打赏
  • 举报
回复
飘~~~
cengshilieren 2010-05-10
  • 打赏
  • 举报
回复
我是来打酱油的
加载更多回复(144)

566

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧