相對《簡單多執行緒拷貝單檔案示例》擴充套件了任務佇列。
主要核心在於將單個大檔案分成多份(比如100),形成乙個任務,並將任務用鍊錶鏈結起來,形成乙個佇列(fifo)或者棧(無非是順序不同)。
相對第一版來說,thread_block的定義發生了些變化,但使用者介面未變。
typedef struct thread_block定義乙個新的結構,原本設想是作為全域性變數的。thread_block_t;
typedef struct msg_boxmsg_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,此處注意要判斷佇列是否為空,沒有任務返回為null,作為執行緒終止的判斷。thread_block_t *msg)
thread_block_t *mfetch_task(msg_box_t *mbox)
pthread_mutex_unlock(&(mbox->mutex));
return msg;
}
分析檔案,將檔案任務分塊,用鍊錶鏈結起來,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在v1中,對乙個thread_block_t的操作是乙個執行緒函式操作。在v2中,為了程式的流暢性,依然作為乙個函式,新的函式名為thread_block_copy,實現與第一版基本一致。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;
}
thread_block_copy
int thread_block_copy(thread_block_t *block,char *buf)注意:請忽略ret返回值。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;
}
再就是執行緒處理函式了。
/*由於將大塊的實現放到了了thread_block_copy這個函式,所以,顯得還是很清新的。** @brief 執行緒實現函式
* */
void *thread_copy_fn(void *arg)
//end while
printf("
#####thread exit %ld#####\n
",pthread_self());
pthread_exit(null);
}
從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...