第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定

作業(yè)社區(qū)

探索學(xué)習(xí)新天地,共享知識資源!

0 提交作業(yè)
0 布置作業(yè)
0 滿分作業(yè)
得分 100
學(xué)習(xí)任務(wù)

浪潮君 的學(xué)生作業(yè):

#include // 標(biāo)準(zhǔn)輸入輸出函數(shù),如 printf #include // 提供 exit、malloc、perror 等函數(shù) #include // 提供 access、read、close 等系統(tǒng)調(diào)用 #include // 提供 open、O_RDONLY 等常量 #include // 提供 select() 函數(shù) #include // 提供 mkfifo() 等定義 #include // 提供 memset() 字符處理函數(shù) #define FIFO_PATH "myfifo" // 定義有名管道文件名(路徑) int main(void) { int fifo_fd, ret; // 管道文件描述符,select() 的返回值 fd_set readfds, tmpfds; // select() 使用的讀文件描述符集合 struct timeval tv = {3, 0}; // 超時時間,3 秒 0 微秒 struct timeval tmp_tv; // 每次循環(huán)前要復(fù)制 timeval,因為 select 會修改它 char buffer[128] = {0}; // 用于讀取數(shù)據(jù)的緩沖區(qū) // ---------- 步驟1:檢查管道是否存在,不存在就創(chuàng)建 ---------- if (access(FIFO_PATH, F_OK) == -1) { // 如果文件不存在 if (mkfifo(FIFO_PATH, 0666) == -1) { // 創(chuàng)建有名管道,權(quán)限為 0666 perror("mkfifo"); // 創(chuàng)建失敗則輸出錯誤信息 exit(EXIT_FAILURE); // 退出程序 } } // ---------- 步驟2:以只讀 + 非阻塞方式打開有名管道 ---------- fifo_fd = open(FIFO_PATH, O_RDONLY | O_NONBLOCK); // 非阻塞打開,避免無人寫入時卡住 if (fifo_fd == -1) { perror("open fifo"); // 打開失敗 exit(EXIT_FAILURE); } // ---------- 步驟3:設(shè)置 select 的監(jiān)聽目標(biāo) ---------- FD_ZERO(&readfds); // 清空描述符集合 FD_SET(fifo_fd, &readfds); // 把管道文件描述符加入集合 int maxfd = fifo_fd; // 計算最大文件描述符,用于 select 第一個參數(shù) printf("監(jiān)聽管道 %s 中...\n", FIFO_PATH); // 提示監(jiān)聽開始 // ---------- 步驟4:進(jìn)入循環(huán),不斷監(jiān)聽管道是否有數(shù)據(jù) ---------- for (;;) { tmp_tv = tv; // select 會修改 timeout,每次循環(huán)前重置它 tmpfds = readfds; // 同樣復(fù)制 fd_set,select 會修改 // ---------- 調(diào)用 select 監(jiān)聽 ---------- ret = select(maxfd + 1, &tmpfds, NULL, NULL, &tmp_tv); if (ret == -1) { perror("[ERROR] select(): "); // select 出錯 close(fifo_fd); exit(EXIT_FAILURE); } else if (ret == 0) { printf("[INFO] 等待超時,沒有數(shù)據(jù)。\n"); // 超時無數(shù)據(jù) } else { // ---------- 如果文件描述符可讀 ---------- if (FD_ISSET(fifo_fd, &tmpfds)) { memset(buffer, 0, sizeof(buffer)); // 清空緩沖區(qū) int n = read(fifo_fd, buffer, sizeof(buffer) - 1); // 嘗試讀取數(shù)據(jù) if (n > 0) { printf("[RECV] %s", buffer); // 打印收到的數(shù)據(jù) } else if (n == 0) { // 寫端關(guān)閉,此時讀端 read 會返回 0 printf("[INFO] 寫端關(guān)閉,重新打開 FIFO...\n"); close(fifo_fd); // 關(guān)閉舊 fd fifo_fd = open(FIFO_PATH, O_RDONLY | O_NONBLOCK); // 重新打開 if (fifo_fd == -1) { perror("reopen fifo"); exit(EXIT_FAILURE); } FD_ZERO(&readfds); // 清空集合重新設(shè)置 FD_SET(fifo_fd, &readfds); maxfd = fifo_fd; } } } } close(fifo_fd); return 0; }

得分 100
學(xué)習(xí)任務(wù)

浪潮君 的學(xué)生作業(yè):

#include #include #include #include #include // ------------------- 宏定義 ------------------- #define MAX_CONSUMERS 3 // 消費者線程的最大數(shù)量 // ------------------- 全局共享資源 ------------------- static int number = 0; // 當(dāng)前庫存產(chǎn)品數(shù)量(共享變量) static int total_of_produce = 0; // 所有生產(chǎn)者線程總共要生產(chǎn)的產(chǎn)品數(shù)量 static int total_of_consume = 0; // 所有消費者線程總共已消費的產(chǎn)品數(shù)量 // ------------------- 線程同步工具 ------------------- static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; // 互斥鎖,保護(hù)臨界區(qū)(庫存、總量等) static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; // 條件變量,用于線程等待/喚醒 // ------------------- 結(jié)構(gòu)體:線程參數(shù) ------------------- typedef struct { int count; // 當(dāng)前生產(chǎn)者線程要生產(chǎn)的產(chǎn)品數(shù)量 int id; // 當(dāng)前線程編號(從 1 開始) } ProducersArg; // ------------------- 生產(chǎn)者線程函數(shù) ------------------- void *producer_thread(void *arg) { ProducersArg *parg = (ProducersArg *) arg; for (int i = 0; i < parg->count; i++) { pthread_mutex_lock(&mtx); // 進(jìn)入臨界區(qū),鎖定資源 number++; // 庫存 +1 printf("生產(chǎn)者[%d] 生產(chǎn)了一個產(chǎn)品,總庫存:%d\n", parg->id, number); pthread_cond_broadcast(&cond); // 喚醒所有消費者線程(庫存可能可消費了) pthread_mutex_unlock(&mtx); // 解鎖,退出臨界區(qū) usleep(random() % 500000); // 模擬生產(chǎn)耗時(0~0.5 秒) } free(parg); // 釋放傳入的參數(shù)結(jié)構(gòu)體(堆內(nèi)存) return NULL; } // ------------------- 消費者線程函數(shù) ------------------- void *consumer_thread(void *arg) { int id = *(int *) arg; // 取出線程編號 free(arg); // 釋放編號內(nèi)存(主線程 malloc 的) while (true) { pthread_mutex_lock(&mtx); // 鎖住臨界區(qū) // 如果已經(jīng)消費完所有產(chǎn)品,就退出等待 while (total_of_consume >= total_of_produce) pthread_cond_wait(&cond, &mtx); // 等待生產(chǎn)者喚醒 // 二次判斷:是否所有產(chǎn)品都消費完 if (total_of_consume >= total_of_produce) { pthread_mutex_unlock(&mtx); // 解鎖后退出 break; } number--; // 消費一個產(chǎn)品 total_of_consume++; // 消費計數(shù)器 +1 printf("消費者[%d] 消費了一個產(chǎn)品,剩余庫存:%d\n", id, number); pthread_mutex_unlock(&mtx); // 解鎖臨界區(qū) usleep(random() % 500000); // 模擬消費耗時 } return NULL; } // ------------------- 主線程函數(shù) ------------------- int main(int argc, char *argv[]) { if (argc < 2) { fprintf(stderr, "用法: %s ...\n", argv[0]); exit(EXIT_FAILURE); } int num_producers = argc - 1; // 生產(chǎn)者線程數(shù) = 參數(shù)數(shù)量 - 程序名 pthread_t producers[num_producers]; // 生產(chǎn)者線程 ID 數(shù)組 pthread_t consumers[MAX_CONSUMERS]; // 消費者線程 ID 數(shù)組 // 創(chuàng)建生產(chǎn)者線程 for (int i = 0; i < num_producers; i++) { char *endptr = NULL; long val = strtol(argv[i + 1], &endptr, 10); // 解析參數(shù) // 參數(shù)非法判斷:必須是正整數(shù) if (*endptr != '\0' || val count = count; parg->id = i + 1; // 線程編號從 1 開始 // 創(chuàng)建線程 if (pthread_create(&producers[i], NULL, producer_thread, parg) != 0) { perror("pthread_create(生產(chǎn)者)"); free(parg); exit(EXIT_FAILURE); } } // 創(chuàng)建消費者線程 for (int i = 0; i < MAX_CONSUMERS; i++) { int *cid = malloc(sizeof(int)); if (!cid) { perror("malloc"); exit(EXIT_FAILURE); } *cid = i + 1; // 編號從 1 開始 if (pthread_create(&consumers[i], NULL, consumer_thread, cid) != 0) { perror("pthread_create(消費者)"); free(cid); exit(EXIT_FAILURE); } } // 等待所有生產(chǎn)者線程結(jié)束 for (int i = 0; i < num_producers; i++) { pthread_join(producers[i], NULL); } // 等待所有消費者線程結(jié)束 for (int i = 0; i < MAX_CONSUMERS; i++) { pthread_join(consumers[i], NULL); } // 銷毀同步資源 pthread_mutex_destroy(&mtx); pthread_cond_destroy(&cond); printf("所有產(chǎn)品已被消費完畢,總共消費 %d 個\n", total_of_consume); return 0; }

微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號