免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2060 | 回复: 4
打印 上一主题 下一主题

[算法] 第一次写多线程,大致地写个载入模块,请大家指正 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-27 00:21 |只看该作者 |倒序浏览
本帖最后由 funcman 于 2010-04-27 00:32 编辑
  1. // Loader.h
  2. #ifndef LOADER_H
  3. #define LOADER_H

  4. extern "C" {

  5. typedef struct LoadRequest_ LoadRequest;

  6. LoadRequest*SendRequest(char* filename);
  7. void        ReleaseRequest(LoadRequest* request);
  8. void*       GetData(LoadRequest* request);
  9. bool        IsReady(LoadRequest* request);
  10. bool        IsError(LoadRequest* request);

  11. }//extern "C"

  12. #endif//LOADER_H
复制代码
  1. // Loader.cpp
  2. #include "Loader.h"
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <assert.h>
  7. #include <pthread.h>

  8. extern "C" {

  9. typedef enum RequestState_ {
  10.     LOADING,
  11.     READY,
  12.     ERROR,
  13. } RequestState;

  14. typedef struct Request_ {
  15.     RequestState    stat;
  16.     char            filename[512];
  17.     void*           data;
  18. } Request;

  19. void* load_func_(void* arg) {
  20.     assert(arg);
  21.     Request* req = (Request*)arg;
  22.     FILE* fp = fopen(req->filename, "r");
  23.     if( !fp ) req->stat = ERROR;
  24.     else {
  25.         fseek(fp, 0, SEEK_END);
  26.         int len = ftell(fp);
  27.         req->data = malloc(len);
  28.         if( !(req->data) ) req->stat = ERROR;
  29.         else {
  30.             fseek(fp, 0, SEEK_SET);
  31.             fread(req->data, len, 1, fp);
  32.             req->stat = READY;
  33.         }
  34.         fclose(fp);
  35.     }
  36.     return 0;
  37. }

  38. LoadRequest* SendRequest(char* filename) {
  39.     pthread_t t;
  40.     Request* req = (Request*)malloc(sizeof(Request));
  41.     if(!req) return 0;
  42.     req->stat = LOADING;
  43.     strcpy(req->filename, filename);
  44.     pthread_create(&t, 0, load_func_, req);
  45.     return (LoadRequest*)req;
  46. }

  47. void ReleaseRequest(LoadRequest* request) {
  48.     assert(request);
  49.     Request* req = (Request*)request;
  50.     assert(req->stat==READY);
  51.     free(req->data);
  52.     free(req);
  53. }

  54. void* GetData(LoadRequest* request) {
  55.     assert(request);
  56.     Request* req = (Request*)request;
  57.     if( req->stat != READY ) return 0;
  58.     return req->data;
  59. }

  60. bool IsReady(LoadRequest* request) {
  61.     assert(request);
  62.     Request* req = (Request*)request;
  63.     return (req->stat==READY);
  64. }

  65. bool IsError(LoadRequest* request) {
  66.     assert(request);
  67.     Request* req = (Request*)request;
  68.     return (req->stat==ERROR);
  69. }

  70. }//extern "C"
复制代码
  1. // Main.cpp
  2. #include <stdio.h>
  3. #include "Loader.h"

  4. int main(void) {
  5.     LoadRequest* req = SendRequest("test.txt");
  6.     while( !IsReady(req) ) {
  7.         if( IsError(req) ) {
  8.             printf("Error!\n");
  9.             break;
  10.         }
  11.         printf("Loading...\n");
  12.     }
  13.     if( IsReady(req) ) {
  14.         printf("Ready!\nThe text is:%s\n", (char*)GetData(req));
  15.     }
  16.     return 0;
  17. }
复制代码
编译自然是:
$ g++ Loader.cpp Main.cpp -o MLLoader

运行是正常的。

我就是想知道,我这么写是不是包含了很多潜在的错误。
谢家指正!
:)

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2010-04-27 08:20 |只看该作者
没有调用ReleaseRequest释放。
多线程读文件并不能快多少吧

论坛徽章:
0
3 [报告]
发表于 2010-04-27 08:51 |只看该作者
不求快,求不阻塞.

代码本身问题还很多...

论坛徽章:
0
4 [报告]
发表于 2010-04-27 09:50 |只看该作者
如果文件很大,你这样读,会把整个文件读到缓冲区,很好内存

论坛徽章:
0
5 [报告]
发表于 2010-04-27 21:56 |只看该作者
不管大文件
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP