亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2076 | 回復: 4
打印 上一主題 下一主題

[算法] 第一次寫多線程,大致地寫個載入模塊,請大家指正 [復制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 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 [報告]
發(fā)表于 2010-04-27 08:20 |只看該作者
沒有調(diào)用ReleaseRequest釋放。
多線程讀文件并不能快多少吧

論壇徽章:
0
3 [報告]
發(fā)表于 2010-04-27 08:51 |只看該作者
不求快,求不阻塞.

代碼本身問題還很多...

論壇徽章:
0
4 [報告]
發(fā)表于 2010-04-27 09:50 |只看該作者
如果文件很大,你這樣讀,會把整個文件讀到緩沖區(qū),很好內(nèi)存

論壇徽章:
0
5 [報告]
發(fā)表于 2010-04-27 21:56 |只看該作者
不管大文件
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP