IO學習---->線程

1.創建兩個線程,分支線程1拷貝文件的前一部分,分支線程2拷貝文件的后一部分

#include <head.h>
sem_t sem;
long half_size = 0;  // 全局變量,供所有線程共享void* product(void *arg) 
{FILE *src = fopen("IO.text", "rb");FILE *dest = fopen("IO1.text", "rb+");if (src == NULL || dest == NULL) {perror("文件打開失敗");pthread_exit(NULL);}char buf[128] = {0};size_t n;while ((n = fread(buf, 1, sizeof(buf), src)) > 0) {if (ftell(src) > half_size) {n -= (ftell(src) - half_size); // 防止越界寫入}if (fwrite(buf, 1, n, dest) != n) {perror("線程1寫入失敗");fclose(src);fclose(dest);pthread_exit(NULL);}if (ftell(src) >= half_size) {break;  // 退出循環,完成前半部分寫入}}printf("線程1完成文件前半部分的拷貝。\n");fclose(src);fclose(dest);sem_post(&sem);  // 通知消費者線程pthread_exit(NULL);
}void* consumer(void *arg) 
{sem_wait(&sem);  // 等待生產者完成前半部分FILE *src_child = fopen("IO.text", "rb");FILE *dest_child = fopen("IO1.text", "rb+");if (src_child == NULL || dest_child == NULL) {perror("文件打開失敗");pthread_exit(NULL);}fseek(src_child, half_size, SEEK_SET);fseek(dest_child, half_size, SEEK_SET);char buf[128] = {0};size_t n;while ((n = fread(buf, 1, sizeof(buf), src_child)) > 0) {if (fwrite(buf, 1, n, dest_child) != n) {perror("線程2寫入失敗");fclose(src_child);fclose(dest_child);pthread_exit(NULL);}}printf("線程2完成文件后半部分的拷貝。\n");fclose(src_child);fclose(dest_child);pthread_exit(NULL);
}int main(int argc, const char *argv[]) 
{FILE *src = fopen("IO.text", "rb");if (src == NULL) {perror("打開源文件失敗");return -1;}FILE *dest = fopen("IO1.text", "wb");if (dest == NULL) {perror("打開目標文件失敗");fclose(src);return -1;}// 計算文件大小和一半位置fseek(src, 0, SEEK_END);long file_size = ftell(src);rewind(src);half_size = file_size / 2;sem_init(&sem, 0, 0);pthread_t tid1, tid2;if ((errno = pthread_create(&tid1, NULL, product, NULL)) != 0) {perror("pthread_create error");}if ((errno = pthread_create(&tid2, NULL, consumer, NULL)) != 0) {perror("pthread_create error");}pthread_join(tid1, NULL);pthread_join(tid2, NULL);sem_destroy(&sem);fclose(src);fclose(dest);return 0;
}

2.創建3個線程,線程A打印A,線程B打印B,線程C打印C,要求重復打印順序ABC ?(分別使用信號量和條件變量實現)

#include <head.h>
//創建信號量
sem_t sema;
sem_t semb;
sem_t semc;
void* pta(void* arg)
{while(1){//sleep(1);sem_wait(&sema);printf("A\n");sem_post(&semb);}pthread_exit(NULL);
}void* ptb(void* arg)
{while(1){//sleep(1);sem_wait(&semb);printf("B\n");sem_post(&semc);}pthread_exit(NULL);
}void* ptc(void* arg)
{while(1){sleep(1);sem_wait(&semc);printf("C\n");sem_post(&sema);}pthread_exit(NULL);
}int main(int argc, const char *argv[])
{sem_init(&sema,0,1);sem_init(&semb,0,0);sem_init(&semc,0,0);pthread_t std1,std2,std3;if((errno=pthread_create(&std1,NULL,pta,NULL))!=0)PRINT_ERROR("pthread_create error");if((errno=pthread_create(&std2,NULL,ptb,NULL))!=0)PRINT_ERROR("pthread_create error");if((errno=pthread_create(&std3,NULL,ptc,NULL))!=0)PRINT_ERROR("pthread_create error");pthread_join(std1,NULL);pthread_join(std2,NULL);pthread_join(std3,NULL);sem_destroy(&sema);sem_destroy(&semb);sem_destroy(&semc);return 0;
}
#include <head.h>
//定義并初始化條件變量
pthread_cond_t cond3 =PTHREAD_COND_INITIALIZER;
pthread_cond_t cond1 =PTHREAD_COND_INITIALIZER;
pthread_cond_t cond2 =PTHREAD_COND_INITIALIZER;
//定義并初始化互斥鎖
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;//設置標志位取消sleepint flag =0;
//pthread_cond_t cond;
//pthread_cond_init(&cond,NULL);
void* pta(void *arg)
{while(1){//  sleep(1);//放棄CPU資源,使cpu一定先使用消費者線程pthread_mutex_lock(&mutex);if(flag!=0)pthread_cond_wait(&cond3,&mutex);printf("A\n");flag=1;pthread_cond_signal(&cond1);pthread_mutex_unlock(&mutex);}pthread_exit(NULL);
}
void* ptb(void *arg)
{while(1){//上鎖pthread_mutex_lock(&mutex);if(flag!=1)//阻塞休眠并解鎖pthread_cond_wait(&cond1,&mutex);printf("B\n");flag=2;//解鎖pthread_mutex_unlock(&mutex);pthread_cond_signal(&cond2);}pthread_exit(NULL);
}
void* ptc(void *arg)
{while(1){//上鎖pthread_mutex_lock(&mutex);if(flag!=2)//阻塞休眠并解鎖pthread_cond_wait(&cond2,&mutex);printf("C\n");flag=0;//解鎖pthread_mutex_unlock(&mutex);pthread_cond_signal(&cond3);}pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{pthread_t std1,std2,std3,std4,std5;if( (errno=pthread_create(&std1,NULL,pta,NULL))!=0){PRINT_ERROR("pthread_create error");}if((errno=pthread_create(&std2,NULL,ptb,NULL))!=0){                                                                              PRINT_ERROR("pthread_create error");}if((errno=pthread_create(&std3,NULL,ptc,NULL))!=0){PRINT_ERROR("pthread_create error");}pthread_join(std1,NULL);pthread_join(std2,NULL);pthread_join(std3,NULL);pthread_mutex_destroy(&mutex);pthread_cond_destroy(&cond3);pthread_cond_destroy(&cond1);pthread_cond_destroy(&cond2);return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/897465.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/897465.shtml
英文地址,請注明出處:http://en.pswp.cn/news/897465.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深度學習分詞器char-level實戰詳解

一、三種分詞器基本介紹 word-level&#xff1a;將文本按照空格或者標點分割成單詞&#xff0c;但是詞典大小太大 subword-level&#xff1a;詞根分詞&#xff08;主流&#xff09; char-level&#xff1a;將文本按照字母級別分割成token 二、charlevel代碼 導包&#xff1…

基于SpringBoot實現旅游酒店平臺功能六

一、前言介紹&#xff1a; 1.1 項目摘要 隨著社會的快速發展和人民生活水平的不斷提高&#xff0c;旅游已經成為人們休閑娛樂的重要方式之一。人們越來越注重生活的品質和精神文化的追求&#xff0c;旅游需求呈現出爆發式增長。這種增長不僅體現在旅游人數的增加上&#xff0…

git規范提交之commitizen conventional-changelog-cli 安裝

一、引言 使用規范的提交信息可以讓項目更加模塊化、易于維護和理解&#xff0c;同時也便于自動化工具&#xff08;如發布工具或 Changelog 生成器&#xff09;解析和處理提交記錄。 通過編寫符合規范的提交消息&#xff0c;可以讓團隊和協作者更好地理解項目的變更歷史和版本…

前端實現版本更新自動檢測?

&#x1f916; 作者簡介&#xff1a;水煮白菜王&#xff0c;一位資深前端勸退師 &#x1f47b; &#x1f440; 文章專欄&#xff1a; 前端專欄 &#xff0c;記錄一下平時在博客寫作中&#xff0c;總結出的一些開發技巧和知識歸納總結?。 感謝支持&#x1f495;&#x1f495;&a…

硬件基礎(4):(5)設置ADC電壓采集中MCU的參考電壓

Vref 引腳通常是 MCU (特別是帶有 ADC 的微控制器) 上用來提供或接收基準電壓的引腳&#xff0c;ADC 會以該基準電壓作為量程參考對輸入模擬信號進行數字化轉換。具體來說&#xff1a; 命名方式 在不同廠家的 MCU 中&#xff0c;Vref 引腳可能會被標記為 VREF / VREF- / VREF_…

postman接口請求中的 Raw是什么

前言 在現代的網絡開發中&#xff0c;API 的使用已經成為數據交換的核心方式之一。然而&#xff0c;在與 API 打交道時&#xff0c;關于如何發送請求體&#xff08;body&#xff09;內容類型的問題常常困擾著開發者們&#xff0c;尤其是“raw”和“json”這兩個術語之間的區別…

為什么要使用前綴索引,以及建立前綴索引:sql示例

背景&#xff1a; 你想啊&#xff0c;數據庫里有些字段&#xff0c;它老長了&#xff0c;就像那種 varchar(255) 的字段&#xff0c;這玩意兒要是整個字段都拿來建索引&#xff0c;那可太占地方了。打個比方&#xff0c;這就好比你要在一個超級大的筆記本上記東西&#xff0c;每…

【語料數據爬蟲】Python爬蟲|批量采集會議紀要數據(1)

前言 本文是該專欄的第2篇,后面會持續分享Python爬蟲采集各種語料數據的的干貨知識,值得關注。 在本文中,筆者將主要來介紹基于Python,來實現批量采集“會議紀要”數據。同時,本文也是采集“會議紀要”數據系列的第1篇。 采集相關數據的具體細節部分以及詳細思路邏輯,筆…

Android 線程池實戰指南:高效管理多線程任務

在 Android 開發中&#xff0c;線程池的使用非常重要&#xff0c;尤其是在需要處理大量異步任務時。線程池可以有效地管理線程資源&#xff0c;避免頻繁創建和銷毀線程帶來的性能開銷。以下是線程池的使用方法和最佳實踐。 1. 線程池的基本使用 &#xff08;1&#xff09;創建線…

SQL29 計算用戶的平均次日留存率

SQL29 計算用戶的平均次日留存率 計算用戶的平均次日留存率_牛客題霸_牛客網 題目&#xff1a;現在運營想要查看用戶在某天刷題后第二天還會再來刷題的留存率。 示例&#xff1a;question_practice_detail -- 輸入&#xff1a; DROP TABLE IF EXISTS question_practice_detai…

深度學習分類回歸(衣帽數據集)

一、步驟 1 加載數據集fashion_minst 2 搭建class NeuralNetwork模型 3 設置損失函數&#xff0c;優化器 4 編寫評估函數 5 編寫訓練函數 6 開始訓練 7 繪制損失&#xff0c;準確率曲線 二、代碼 導包&#xff0c;打印版本號&#xff1a; import matplotlib as mpl im…

【leetcode hot 100 19】刪除鏈表的第N個節點

解法一&#xff1a;將ListNode放入ArrayList中&#xff0c;要刪除的元素為num list.size()-n。如果num 0則將頭節點刪除&#xff1b;否則利用num-1個元素的next刪除第num個元素。 /*** Definition for singly-linked list.* public class ListNode {* int val;* Lis…

【iOS逆向與安全】sms短信轉發插件與上傳服務器開發

一、目標 一步步分析并編寫一個短信自動轉發的deb插件 二、工具 mac系統已越獄iOS設備:脫殼及frida調試IDA Pro:靜態分析測試設備:iphone6s-ios14.1.1三、步驟 1、守護進程 ? 守護進程(daemon)是一類在后臺運行的特殊進程,用于執行特定的系統任務。例如:推送服務、人…

Midjourney繪圖參數詳解:從基礎到高級的全面指南

引言 Midjourney作為當前最受歡迎的AI繪圖工具之一&#xff0c;其強大的參數系統為用戶提供了豐富的創作可能性。本文將深入解析Midjourney的各項參數&#xff0c;幫助開發者更好地掌握這一工具&#xff0c;提升創作效率和質量。 一、基本參數配置 1. 圖像比例調整 使用--ar…

音頻進階學習十九——逆系統(簡單進行回聲消除)

文章目錄 前言一、可逆系統1.定義2.解卷積3.逆系統恢復原始信號過程4.逆系統與原系統的零極點關系 二、使用逆系統去除回聲獲取原信號的頻譜原系統和逆系統幅頻響應和相頻響應使用逆系統恢復原始信號整體代碼如下 總結 前言 在上一篇音頻進階學習十八——幅頻響應相同系統、全…

vue3 使用sass變量

1. 在<style>中使用scss定義的變量和css變量 1. 在/style/variables.scss文件中定義scss變量 // scss變量 $menuText: #bfcbd9; $menuActiveText: #409eff; $menuBg: #304156; // css變量 :root {--el-menu-active-color: $menuActiveText; // 活動菜單項的文本顏色--el…

gbase8s rss集群通信流程

什么是rss RSS是一種將數據從主服務器復制到備服務器的方法 實例級別的復制 (所有啟用日志記錄功能的數據庫) 基于邏輯日志的復制技術&#xff0c;需要傳輸大量的邏輯日志,數據庫需啟用日志模式 通過網絡持續將數據復制到備節點 如果主服務器發生故障&#xff0c;那么備用服務…

熵與交叉熵詳解

前言 本文隸屬于專欄《機器學習數學通關指南》&#xff0c;該專欄為筆者原創&#xff0c;引用請注明來源&#xff0c;不足和錯誤之處請在評論區幫忙指出&#xff0c;謝謝&#xff01; 本專欄目錄結構和參考文獻請見《機器學習數學通關指南》 ima 知識庫 知識庫廣場搜索&#…

程序化廣告行業(3/89):深度剖析行業知識與數據處理實踐

程序化廣告行業&#xff08;3/89&#xff09;&#xff1a;深度剖析行業知識與數據處理實踐 大家好&#xff01;一直以來&#xff0c;我都希望能和各位技術愛好者一起在學習的道路上共同進步&#xff0c;分享知識、交流經驗。今天&#xff0c;咱們聚焦在程序化廣告這個充滿挑戰…

探索在生成擴散模型中基于RAG增強生成的實現與未來

概述 像 Stable Diffusion、Flux 這樣的生成擴散模型&#xff0c;以及 Hunyuan 等視頻模型&#xff0c;都依賴于在單一、資源密集型的訓練過程中通過固定數據集獲取的知識。任何在訓練之后引入的概念——被稱為 知識截止——除非通過 微調 或外部適應技術&#xff08;如 低秩適…