2024.11.18 鮮花
淺談多線程
打上花火
あの日(ひ)見渡(みわた)した渚(なぎさ)を
那天所眺望的海岸
a no hi mi wa ta shi ta na gi sa wo
今(いま)も思(おも)い出(だ)すんだ
直至今日仍能想起
i ma mo o mo i da su n da
砂(すな)の上(うえ)に刻(きざ)んだ言葉(ことば)
在沙灘上刻下的話語
su na no u e ni ki za n da ko to ba
君(きみ)の後(うし)ろ姿(すがた)
和你的背影
ki mi no u shi ro su ga ta
寄(よ)り返(かえ)す波(なみ)が
涌動的波浪
yo ri ka e su na mi ga
足元(あしもと)をよぎり何(なに)かを攫(さら)う
掠過腳邊究竟掠走了什么
a shi mo to wo yo gi ri na ni ka wo sa ra u
夕凪(ゆうなぎ)の中(なか)
風平浪靜之中
yu u na gi no na ka
日暮(ひぐ)れだけが通(とお)り過(す)ぎてゆく
只有黃昏悄悄地流逝
hi gu re da ke ga to o ri su gi te yu ku
パッと光(ひか)って咲(さ)いた
光芒砰然綻放
pa tto hi ka tte sa i ta
花火(はなび)を見(み)てぃた
煙花映入眼簾
ha na bi wo mi te i ta
きっとまだ終(お)わらない夏(なつ)が
一定是夏天還未結束
ki tto ma da o wa ra na i na tsu ga
曖昧(あいまい)な心(こころ)を解(と)かして繋(つな)いだ
將曖昧的心結解開再緊緊相連
a i ma i na ko ko ro wo to ka shi te tsu na i da
この夜(よる)が続(つづ)いて欲(ほ)しかった
愿今夜永不結束
ko no yo ru ga tsu zu i te ho shi ka tta
「あと何度(なんど)君(きみ)と同(おな)じ花火(はなび)を見(み)られるかな」って
還能與你一起看幾次同樣的煙花呢
a to na n do ki mi to o na ji ha na bi wo mi ra re ru ka na tte
笑(わら)う顏(かお)に何(なに)ができるだろうか
面對你的笑容 我又能做些什么呢
wa r au ka o ni na ni ga de ki ru da rou ka
傷(きず)つくこと 喜(よろこ)ぶこと
受傷亦或是喜悅
ki zu tsu ku ko to yo ro ko bu ko to
繰(く)り返(かえ)す波(なみ)と情動(じょうどう)
浪來浪去與情動
ku ri ka e su na mi to jyou dou
焦燥(しょうそう)最終列車(さいしゅうれっしゃ)の音(おと)
焦躁響起了末班列車的聲音
sho u sou sai shu u re ssha no o to
何度(なんど)でも言葉(ことば)にして君(きみ)を呼(よ)ぶよ
無數次用言語呼喚著你
na n do de mo ko to ba ni shi te ki mi wo yo bu yo
波間(なみま)を選(えら)びもう一度(いちど)...
向著海浪 再一次…
na mi ma wo e ra bi mo u i chi do do do do do
もう二度(にど)と悲(かな)しまずに済(す)むように
祈禱不再感受那份悲傷
mo u ni do to ka na shi ma zu ni su mu yo u ni
はっと息(いき)を飲(の)めば
如果突然屏住呼吸
ha tto i ki wo no me ba
消(き)えちゃいそうな光(ひかり)が
那么即將消逝的光芒
ki e cha i sou na hi ka ri ga
きっとまだ 胸(むね)に住(す)んでいた
一定仍能夠留存心中
ki tto ma da mune ni su n de i ta
手(て)を伸(の)ばせば觸(ふ)れた
伸出手就能觸及
te wo no ba se ba hu re ta
暖(あった)かい未來(みらい)は
那溫暖的未來
a tta ka i mi ra i wa
密(ひそ)かに二人(ふたり)を見(み)ていた
默默地守望著兩人
hi so ka ni hu ta ri wo mi te i ta
パッと花火(はなび)が「パッと花火(はなび)が」
怦然綻放的煙花(怦然綻放的煙花)
pa tto ha na bi ga「pa tto ha na bi ga」
夜(よる)に咲(さ)いた「夜(よる)に咲(さ)いた」
在夜空中綻放(在夜空中綻放)
yo ru ni sa i ta「yo ru ni sa i ta」
夜(よる)に咲(さ)いて「夜(よる)に咲(さ)いて」
在夜空中綻放后(在夜空中綻放后)
yo ru ni sai te「yo ru ni sa i te」
靜(しず)かに消(き)えた「靜(しず)かに消(き)えた」
又靜靜地消失(又靜靜地消失)
shi zu ka ni ki e ta「shi zu ka ni ki e ta」
離(はな)さないで 「離(はな)れないで」
請不要離開(請不要離開)
ha na sa na i de「ha na re na i de」
もう少(すこ)しだけ「もう少(すこ)しだけ」
再給一點點時間(再給一點點時間)
mo u su ko shi da ke「mo u su ko shi da ke」
もう少(すこ)しだけ
再給一點點時間
mo u su ko shi da ke
このままで
就一直這樣
ko no ma ma de
あの日(ひ)見渡(みわた)した渚(なぎさ)を
那天所眺望的海岸
a no hi mi wa ta shi ta na gi sa wo
今(いま)も思(おも)い出(だ)すんだ
直至今日仍能想起
i ma mo o mo i da su n da
砂(すな)の上(うえ)に刻(きざ)んだ言葉(ことば)
在沙灘上刻下的話語
su na no u e ni ki za n da ko to ba
君(きみ)の後(うし)ろ姿(すがた)
和你的背影
ki mi no u shi ro su ga ta
パッと光(ひか)って咲(さ)いた
光芒怦然綻放
pa tto hi ka tte sai ta
花火(はなび)を見(み)ていた
煙花映入眼簾
ha na bi wo mi te i ta
きっとまだ終(お)わらない夏(なつ)が
還未結束的夏天 一定會將
ki tto ma da o wa ra na i na tsu ga
曖昧(あいまい)な心(こころ)を解(と)かして繋(つな)いだ
曖昧的心結融化相連在一起
a i ma i na ko ko ro wo to ka shi te tsu na i da
この夜(よる)が続(つづ)いて欲(ほ)しかった
愿今夜永不結束[2]
ko no yo ru ga tsu zu i te ho shi ka tta

考慮到一般在 OI 上沒啥用,所以真的非常淺……
對于不太好用的 pthread_create thread 就先按下不表,直接說最有用的 async。
async(T,F,a,b,...) 是函數,返回值是 future,可以用 .get() 獲得其返回值,.wait() 等待到函數進行完,.wait_for(t),在 t 秒內等待,超時則返回。
參數中 F 表示要調用的函數,a,b,... 是其參數,其參數只能傳值,想傳引用的話要用 ref(a) 和 cref(a) ,其中 a 是參數,ref 是引用,cref 是常量引用。
T 是創建策略,一共有三種:launch::async 表示立刻調用函數; launch::deferred 表示在查詢值(調用 .get() 等)時調用函數; launch::async|launch::deferred 是默認策略,按照編譯器指定,一般是 launch::async
async 封裝的很好,我們不需要考慮其是否會在主線程結束前結束,也不需要自己結束和釋放,其會在返回值析構時調用 .wait()。
對于多個線程同時操作同一部分,有 mutex 和 atomic。
mutex 是一個類,對于其對象,有 .lock:表示上鎖,其他線程在上鎖的地方會阻塞,直到解鎖,.unlock:表示解鎖,.try_lock() 是嘗試上鎖,若已經上鎖返回 false,否則上鎖并返回 true。
注意若其被同一個線程鎖住,會死鎖。
atomic<T> 專注于變量,其中 T 是變量類型,其與正常的變量大體沒區別,只是在多線程時避免同時操作,速度快于頻繁上鎖。
基本上語法就是這么些,更深的可以自己搜。其實對于簡單實現一個對拍之類的,只要會 async 基本就夠了。
一個簡單的多線程對拍
應該是比較易懂的。
T 是線程數,N 是每線程測試組數。
首先要建一個叫 data 的文件夾。
程序叫 1.cpp;std 叫 std.cpp;數據叫 rnd.cpp
編譯時加 -pthread 或 -lpthread。
有沒有好心人幫忙測一下效率 QwQ
#include<bits/stdc++.h>
using namespace std;
int S(const string &a){return system(a.c_str());}
const int T=30,N=100;
future<void> pt[T];
void Run(int id){
string p=" data/"+to_string(id),i=p+".in ",o=p+".out ",a=p+".ans ";
for(int p=1;p<=N;++p) if(S("./rnd >"+i+"&& ./std <"+i+'>'+a+"&& ./1<"+i+'>'+o+"&& diff"+o+a+"-Z > /dev/null")) return cout<<"Wa\n",void();
S("rm -f"+i+";rm -f"+o+";rm -f"+a);
}
int main(){
assert(!S("g++ 1.cpp -o 1 -O2 -std=c++14 && g++ rnd.cpp -o rnd -O2 -std=c++14 && g++ std.cpp -o std -O2 -std=c++14"));
S("cd data && rm -rf *"); for(int i=0;i<T;++i) pt[i]=async(Run,i);
}
P


本文來自博客園,作者:xrlong,轉載請注明原文鏈接:http://www.rzrgm.cn/xrlong/p/18551095
版權聲明:本作品采用 「署名-非商業性使用-相同方式共享 4.0 國際」許可協議(CC BY-NC-SA 4.0) 進行許可。

浙公網安備 33010602011771號