簡單多執行緒拷貝單檔案v2

2022-03-04 04:37:44 字數 2926 閱讀 4916

相對《簡單多執行緒拷貝單檔案示例》擴充套件了任務佇列。

主要核心在於將單個大檔案分成多份(比如100),形成乙個任務,並將任務用鍊錶鏈結起來,形成乙個佇列(fifo)或者棧(無非是順序不同)。

相對第一版來說,thread_block的定義發生了些變化,但使用者介面未變。

typedef struct thread_block

thread_block_t;

定義乙個新的結構,原本設想是作為全域性變數的。

typedef struct msg_box

msg_box_t;

void msgbox_init(msg_box_t *mbox)

void msgbox_destroy(msg_box_t *mbox)

除錯資訊

void msgbox_printf(msg_box_t *mbox)

}

新增到任務佇列和從佇列中取任務。

void mpost_task(msg_box_t *mbox,

thread_block_t *msg)

thread_block_t *mfetch_task(msg_box_t *mbox)

pthread_mutex_unlock(&(mbox->mutex));

return msg;

}

此處注意要判斷佇列是否為空,沒有任務返回為null,作為執行緒終止的判斷。

分析檔案,將檔案任務分塊,用鍊錶鏈結起來,v1版本中是分配陣列,此處是分配鍊錶節點。同時新增了每個執行緒處理的大小

size_t block_size = threads_block;

同時需要注意的是,由於一般 對於正數x有x = a * b +c (a b c >0),所以分配到塊數應該是(a+1).

反映到程式中就是

for(; i <= thread_size;++i)

複製總是少了一些,bug了乙個小時才發現。悲催。

void get_thread_task(const

char *src,

const

char *dst,

msg_box_t *mbox)

size_t file_size = get_filesize(infd);

size_t block_size = threads_block;

size_t thread_size= file_size / block_size;

printf("

filesize = %d\t percent_blocks = %d\n

",\file_size,block_size);

int i = 0;

thread_block_t *block ;

//init-thread-block

for(; i <= thread_size;++i)

///the last piece

//blocks[i].block_size = file_size%block_size;

block->block_size = file_size%block_size;

}

在v1中,對乙個thread_block_t的操作是乙個執行緒函式操作。在v2中,為了程式的流暢性,依然作為乙個函式,新的函式名為thread_block_copy,實現與第一版基本一致。

thread_block_copy

int thread_block_copy(thread_block_t *block,char *buf)

printf("

thread = %ld\t write = %ld\t read %d\n

",\pthread_self(),bytes_write,bytes_read);

}//end-write;

///error while write

if(bytes_write == -1)

break;

}//end-if

}//end-read

return ret;

}

注意:請忽略ret返回值。

再就是執行緒處理函式了。

/*

** @brief 執行緒實現函式

* */

void *thread_copy_fn(void *arg)

//end while

printf("

#####thread exit %ld#####\n

",pthread_self());

pthread_exit(null);

}

由於將大塊的實現放到了了thread_block_copy這個函式,所以,顯得還是很清新的。

從mbox中取任務,再進行copy處理。

over。

此版需要fixed的地方

1.由於get_thread_task中的開啟了檔案,所以,必須在拷貝結束之後close,檔案fd該存在**就成了乙個問題,

所以在生成佇列的時候,多生成了乙個節點,即帶頭節點的單鏈表。將fd資訊儲存到第乙個節點當中。所以出現了

很ugly的**

mbox.mblock->infd = mbox.mblock->next->infd;

mbox.mblock->outfd = mbox.mblock->next->outfd;

這點應該是介面處理得不夠好的原因。

2.對於動態的情況來說,不會是parse完成後,生成任務佇列之後就不再新增新的任務,鍊錶應該的動態的,即get_thread_task

也應該是個執行緒,給thread_copy_fn傳送訊息。此處涉及到任務什麼時候真正完成的判斷(應該的新增應該通訊訊號量即可)。

3.對於2的情形,mbox的**還有改進的空間,因為mbox不涉及到佇列(鍊錶)滿的判斷(參考《訊息佇列的實現》,用迴圈陣列實現)。

多執行緒拷貝檔案

多執行緒拷貝檔案的步驟 宣告乙個帶有 原始檔,目標檔案,當前執行緒拷貝開始位置,當前執行緒拷貝結束位置 這4個引數的構造器 拷貝執行緒中需要實現 1.統計當前執行緒的拷貝進度 2.使用randomaccessfile獲取輸出流,然後使用seek 方法跳過需要讀寫位元組數 3.while迴圈的條件要加...

FastMenuGo 檔案右鍵擴充套件外掛程式 V2 0

平時工作和生活中使用電腦,遇到不大的文字檔案或程式檔案,喜歡用記事本或寫字板開啟檔案進行快速檢視,所以之前寫了個外掛程式,直接把 記事本 和 寫字板 加到檔案右鍵選單裡面了。隨時想開啟就開啟。十分方便!最近發現需要乙個快速定位檔案的功能,所以也一併加入了這個選單擴充套件,名字暫且叫做 轉到檔案所在的...

Python 多執行緒技術拷貝檔案

使用多執行緒拷貝乙個目錄,要求同時拷貝該目錄下的這些檔案 import os from threading import thread 先定義拷貝函式 defcopy dir from,dir to,file 拷貝檔案 if os.path.isfile s s dir from,file f op...