From 1132d9e9a71c30a0c967a56a04cbb6ca9d5a5ae3 Mon Sep 17 00:00:00 2001 From: ChoChoX Date: Sat, 16 May 2026 21:52:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=B9=B6=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=AD=A3=E7=A1=AE=E5=BF=85=E5=81=9A=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- exp1/badcount | Bin 19136 -> 18568 bytes exp1/badcount.c | 59 +++++++++++++++ exp1/psum64.c | 79 +++++++++++++++++++++ exp1/task61 | Bin 19112 -> 16400 bytes exp1/task61.c | 2 +- exp1/task62 | Bin 0 -> 19088 bytes exp1/task62.c | 60 ++++++++-------- exp1/task63 | Bin 0 -> 17008 bytes exp1/task63.c | 185 ++++++++++++++++++++++++++++++++++++++++++++++++ exp1/task64 | Bin 0 -> 16384 bytes exp1/task64.c | 89 +++++++++++++++++++++++ 11 files changed, 444 insertions(+), 30 deletions(-) create mode 100644 exp1/badcount.c create mode 100644 exp1/psum64.c create mode 100755 exp1/task62 create mode 100755 exp1/task63 create mode 100755 exp1/task64 create mode 100644 exp1/task64.c diff --git a/exp1/badcount b/exp1/badcount index 23534afb7080541493025396afd30ac950faca73..50e9bf999fcf44583ec4dd3b8fc90d8a32ae01f8 100755 GIT binary patch delta 3719 zcma)93vg6d89wLUJ-c_`dv`b4EJ1b`p^?&L2{hR}*kmEBYyz!eq!s93Sb;QYLui@h zQA9UPN=q8igx}W4;F#30rqi+N#4>fN5=2X>kJ8#vk~MpD(nB>M zo}GKX|9$>*?m7RtJNY<2I?RX4{Fi-9YbhOArg`|*rySE(ot?H0|GvtxQ`WhiGWhwO zts|8>JCdA@2PB>EGmsgfiKTeshTpj1H$L$+-_K+JEnJrorVCcdk>Hj30xR&2HRPrRG23@RwT0lQ%@wwoBE(6<$A+{OzHJMIi89-To3!?c4Z(o@ zxNo8DV4Shy;zO{+ch4t_i+hpl^hVY&_E+zMe-;;)&fz_Cc03Ky>zi-jGwF;K`7eO#k zkry5^doeTc+vh2M;V@dArq^Hi7E+nP^o30Sq>>p#qjQBEiU!hG2GdtE17|YFO1@5G z97`8|Os-_G9Svr*r*-YM8EsmRc*A_-^}II54U-lMAP(ah!f7uU6#J3FfpTufZc6eG z|0)*Wnm;Hu>)M^OwWm=_W3$3lr0CV%g$t1x_*?;}Qy55pa4tPf>bC-eq9=qQ`X~8- z@DP!n=7Z_!#`Fh!u4>D%_3Zz4zjzxu70~+v5g+!}HcqDhZ6(wHQ|0W$_hRRqaLxAm z@#y->%(Y^16tmcbNMns7ZbKY?w^+P@_>K39#kUcs5MA(4w1TH#ELzUD!H=RJ<)bha z4Rw$FrC6lnXtpvWzJSjUFqWUnMcU(gL~3!dx4ZQ6q3u@1~GuGB|yW-v?^^UTHjurLGi) z;va+G#d{s+jau_XPU8G1jwBe@Dv|p*2Kk7*wp3djKa? zC)L^L1Uc`jp zf~Zep7o-ro$c_kRdjLDj-bH^z=tpT@>L+o@2Ba+x+5H4rQYNgFh7o(XHtw?|Cd&|W zEkIa7!NSIFYeJeDKlu-eavydpO36SP-XywNjc1iccPSyn8dc|dmiBz@^eYsm(SaZW@=a0lEElEts?V(9Y!|N?~6IXs!<5EhV za`O81oHmMFHS>A3^~cn6%bCxwGutrGBIa~9Ic3aR608;HE_<0XrVwQjO!hRyc%!r4 z*&2|r4&WUxE3+ilgyv+c;>}?+c9LyHINKUn8Ri&5L5JBP?6+tRj#5n_>9KJmx@Yq) zBcL{V%vKR@4XE62OO+ke;=197x0m&JjO6i{c`<7zZtf75Jx-^d2PL3#-WnjnAH#9u zXcExope5QGXb#h~f+d^=AhVL0i3pm=qdcrnq!ij~O06NPg=NrFQ*NI^N-%}B!B9)|!aq1YIJ?Sy*bk0!IF-Mw&I;w4*02Y#U4+Y9d}YVGl^-MeYT^ED{b?e}jx?23!vw*99 zeb{G|Ih=>qqS#B!!&2~IeJE^}Z(YY&D-xW|V?G$G4^^9=XQuX$;cFIuQ+`zQD#0@U zX8nFX4%vn{AA#Y9W_|~}+E8BUV`1h?nbtZk$L;Tzyv)2ROl=)x8$;oBs3k8p$7>U5 z1)c0DR_y?P2+lNyV5rfOSLtIksz)(y81}dpWgaV=6NQS5AJ^bAx=_1C2X?}+pPTDb zhP}B3%rpIrCfA(d{zfG9yQ(S?u z)p6ClhfO>MQz+f1T@#F%SPHS0xWl|)hXibCsdY>mMtJ?6XsK1rTiL_|Fx8UB50vbh zxV_KFvk$(yCZP@)oQdr)wI;5buffFq5KG4$=Em3*nAnou$L;2Sh!ME>@r2#nnxhb2 zo3PLP$%4&m6EoiqBXNCox?pVWZqpfvHsyNM%N0TU+#aYnk1#LRaj8SZl(5 zi2fX5y9!z4vNbxFhcVPp7++?m)T| z@7~!G2}YpQv7(yFNhfs*&3HOY(spQ?p>Bp`rj39U;ttcX8D=0;+VRl1BbCsaq)in< zeEod)?f2>FSr?d0|43(UHE+NB{d|Ay?)UxL-FvIYdJgRKX`0~V7dr)UeT_B}QG)T^ zssIuZ+eIDncClVmg0GO6Esxj)Qad&H7t?^k2_`#B$-VSrN{=bGkSN)eO0!kAgsEt- zd9u@~sCX~^q;krX^v zO4%{Js_J9P@ucR{aY*^|()Ey0VoJJ{h|-Z>OWgHzlMM@|-ulieJ1;eq9aFCF-YZt} z*QxK2vfHj4dg)$OA5*UHldz+Be$>R5$6-}psq=SAoj<1Pw8&VlKxK3q_TO_<)Q^9n z@bxdhKK?)FqD?2>`Rn~=qnl8q6)l={bEqNUR95G-Fpcovwk1l|j5Dg6ga;PDdp!zJ+ZzzrPUR109KdN-E9 zSCznD0&d{&rd9w;`PWL|hk@VdbwYeTH5^N(@|Kw!ljTe{V~Nx#vJoq7rsB!igSkxB zVG@9>l!(P}juWxG6*sNea2yKc=Xe}uu~=d>9vjGH<3pK8QW77@<>AiEWUT=aw{k;6 zf~@I+*e3QL=-tyD+Z^5;-s+TZ+ahAUNA57v5cXtovvZ*8S{voP-a5$G$ zmB(z=B^A*Jc=!qqE4;#XaGkez_eyKuVSI87^@ ze5gmM6rFY9{A?k?ITtS9FH&2GKXc*k=g+rXIQN-Mo_FC0u#;w7_%a6-;s-9g#)V&W z;dGCcQ#k_V2$UmGjzBpAu-2JI`QK`bV~nWhY-=(*>Re zPIF&c;Ay}#_rwBEgRwbtfv17fT))E?+rwzxKz$n~f7G60`?tf3`EPpouY35fdHAn* z_$NL5Ne_R*!yjA3cfQ*@dFgkflW#{SesuNFk)F<(&I{4gU0+1liYxDh>VFM{>)Sq$ zPT>Tc?ivFUJ*}HW?wGe$;?!)TGEPl(@p66JIO)BlDD-=!{?)*i4e)U?h zIGaSYU)J9RuYCr#PW@y*cN{`09EBY&CL=oe=xlVVXLhpZgI9Xysk!fTqDNO@9i4n- z_S0}UrN0PnVn&w+iuHx?}zhhm@UyYznf; z7vS|gx*t8=GwVnnaZ7(@ORqZ82kfdA)E}~e1&#a3UO$3baRJ>hrQd}T>S;ymU5$VJ zgJSWWk4@>f+R~cE(r-hGrgxAKC$JeVzelZ~eHQ|G&&g+q^VA?&Ih7+&jzBpAw)30_6ylBT$aOZ(0QC_no8p_+V;>(VjOxjvu#DW`5@~(PNr9bFGocT3zkQWuiN0 znyG}f0BEiLJ2BlBG&P_7&th>D^wia2@f_$`P?{2Le6LvS18w|Cv3L>mVbH6fmp~iT zk2>^QDJAWZ!$KQv&{}J%0@IKYPQU%nz}E&+*jpukf?AK_7945Rc@9+6HSDWfeOG<( zcwk)YT64#5-?sing30~?9G9WTzg;nIq3|Z~X#!NDx_%$W9jeWur>^0oue-L=_bIf< zZp*WfkCl+GhU`@w-+_Dw^^NUOq*Q^!z(GqL^t&+Ti8F-pZ%n>%n^$3x`qXaXNuLtw z()_ZV$`L3>pd5j61j-R8N1z;mas--P;(TvM-#b#GpGGOIv5DaC?r45PiRJ%&t(YTzT1`Os+ciTK_?xxom7Kpl`)4vj z;&16_-a~1nO`M$PHKXc#G@iG-sWenKCbH#H%l>7fP!ryay9d1&S)rg{p6zx-V zMA30YrxiV?=(iO0`u#ATzq{Pu-Mz!uc(lKewF*Y(R(y84Db%^GAos>jw!^*?)q7K-FJ>R3D^rYiksw=}*w+?Y`|* z)GU3F1UmwM=3S5wI)Q;TN`#B0yuTA((lvf!3 zb=3w8qc7c<4cJPoxgb>fXHc&8MqN8GTAqds_MpF7jK;e*3QXTesj>Xu9Y{Kz!>(Ft{`5M>YO>5nLM} zup+GOYVp_Y2;LdIBY0CwZ_~$HG{AbTV34#bbz;|Qq}1Ew!^5{~i|_{)A%WXvE!C?Q zSuTT~vRu2|HVtl&iZzZ9X@CyGV^g!{uL}n4-cemEnl(4OQuadjy|-ys3w3Oj zZ15ted8I~;A^X)%xO58F7qk{TUM-7p4&xenO|?2Q6=LocWb-(5ys3_WYMS_Q* zf&>l}+Gwp%rh~}oq2klpeD#67C~1_5#|V3pGyfl>$67p=G)ZE(FhG&g>0&8FqKW2nFQFlnMilpn|zGWpb;8~=f|>% zw3*B13i(hWdpwg(hAi5;k%tg_MiLK&M$DXr1^1j8qOB(g5DOAR@qC)anOqiv#K2GU_uNRtkfv)H<4Re03UOrsJ5^i132PyfbINnjgJ0!GLge5Bb*Q&g}m8;^FCBa zraBO(*tRWdXVhS}&_Qiqq{3~o#zs>4aGFkEd<17Tg|fO52(^;fL}M2+InZC7=vJ!` z?-jjTG|trUYXa|YGn4|J0ZZ!BIMjz7T+?d*q*51#!e>1AZ3^dk0PFXnpkWkmL~MlG zM~Qw3(8MZdTrWXnpTj}*M${{S@lz;h7@hOJ9LB$a!czS$)vxEIpXDOCmOU)crTolD z{bu1E=U$LzjbghY3r_YHN}5*kFQ?vJdE+fCH$vK;A6_ax1A?T=${2{aAhv~4d9Kw z7Qy3p7M&*?Jz%2>C3p#V1Nu82VNIJp27EcLAKv%7L5Y8$^bL>x>q@_xE*K;pVf|3z zHs;RXErD10mOd}5fm6S{@n26k+8>G7-nm~JfgA1$Re29^>KDKJ`V{^NiC=G!0Dj~3 zusA{bcwJFQ-Rbis{5&P`y6Xmq;@*U5b%t~Fdh5@`toWb+khcm019%cHZ0L(w!?6Ty z>B~binTrh$<@)18u_WFI`B=O#DiXQjk)f28N`^NrtwCE1GqJd7#>Zl*tYwag0W&_F ziX{uf!(%XUaWQ&XEK+qnonx_mhj-uI6YIHWZw#9W_uhBU?z?-t;Q+6_SWi?*qk9jF z*!}|t_v}6pJGgJ(y*)=_M|STy&;twaR>%l%Y5b6FjQk#U>)WrcSSlH};zIUNy~i9S z+9$~`bO)rGVq{})inKRbI#M$6?wO1w^SM|$o=wtz%HD&p!;3Ul$fuG5(L@&O&*zml zXPiJ`biATY9+%i}RJVlQx(;vGk1d=k#xwzx`#YE1wCN0x*gNe%b$rR5x;L0Q5?Kqi zP=-ehX&fo+oPm`H=f{RI9s#vXo2I#x#jqrd*K)YOkiiD#Oj3j~gi4tsLZWF5PDD64 zmW2nKTBa>IhVKe6JXplUATv`#aWYV)ks*sbqLpD3!-F|h$fpt_jA08{x~`#}lh;5v zl~z}BItg#giLld9jHE_VrZuLZ-Ftd5)*7@cv9EdCC702b_;3cb+5T~wMHn~RFzz8> zss6$sG~?Mp+?k5aWCwCwj`#PQsbkDxe|L(@h#(gU#Z zS7N;L7pE{-JenQ*QvZj6tw`6Mwt@K>*2=hkUQcAYUMX|En3F9^5pbBGIrZ~;Bh$31 zkXBcy$o4d$q7=nJYjj*cuU|5yWea!mw*L@>v=+$ry#B|O#&eXo{jA5777=J|k$GNU zWV%UO)8uY(`xPvPP$1uI&+DB`XOtq>@9qCFWxq%1@%ky#H(mA=Gq3$PFp3GU_d4%4 z^`7H(WvIx+?O^`1D7ftnWyka!D=MnQPBkYz_A^R>DeJQv=9$uZjJy7eO2BlQ4HacO zre{6&JpN(&uY6)W_Ux7x;N11|xR5EY+q1qme$Oa-ry4_PD!N^ z*2xX0WEUD${Yu@DvOUiuSU_#1#B`0ax6y@sn{w#&%XX}Ja|!zaWq6W1rVPCHTT9sg zm?q{(Pk9VHtmrOb|Ano#{RcL2awwYxnXjMKN}1M2JRz2nkuF=|8IN +#include +#include +#include +#include + + +void *increase(void *vargp); +void *decrease(void *vargp); +int cnt = 0; + + +int main(int argc, char **argv) +{ + unsigned int niters; + pthread_t t1,t2; + + if (argc != 2) + { + printf("Usage: %s \n", argv[0]); + exit(2); + } + niters = atoll(argv[1]); + + pthread_create(&t1,NULL,increase,(void *)niters); + pthread_create(&t2,NULL,decrease,(void *)niters); + pthread_join(t1,NULL); + pthread_join(t2,NULL); + + if (cnt != 0) + { + printf("Error! cnt=%d\n", cnt); + } + else + { + printf("Correct! cnt=%d\n", cnt); + } + exit(0); +} + +void *increase(void *vargp) +{ + unsigned i ,niters = (unsigned int)vargp; + for ( i = 0; i < niters; i++) + { + cnt++; + } + return NULL; +} + +void *decrease(void *vargp) +{ + unsigned i, niters = (unsigned int)vargp; + for ( i = 0; i < niters; i++) + { + cnt--; + } + return NULL; +} \ No newline at end of file diff --git a/exp1/psum64.c b/exp1/psum64.c new file mode 100644 index 0000000..70f5bfb --- /dev/null +++ b/exp1/psum64.c @@ -0,0 +1,79 @@ +/*任务4(必做):编译、测试和运行示例程序psum64.c +1)测量线程数为1、2、4、8、16时程序的执行时间,计算加速比和效率,并做出解释。 +2)改写该程序psum64.c,保存为task64.c,实现计算02+12+… +(n-1)2功能。 +*/ + +#include +#include +#include +#include +#include + +#define MAXTHREADS 16 + +void *sum(void *vargp); + +unsigned long long psum64[MAXTHREADS]; +unsigned long long nelems_per_thread; + +int main(int argc, char **argv) +{ + unsigned long long i,nelems,log_nelems,nthreads,result = 0; + pthread_t tid[MAXTHREADS]; + int myid[MAXTHREADS]; + + if(argc != 3) + { + printf("Usage: %s \n",argv[0]); + exit(0); + } + nthreads = atoi(argv[1]); + log_nelems = atoi(argv[2]); + nelems = (1LL << log_nelems); + nelems_per_thread = nelems / nthreads; + + for ( i = 0; i < nthreads; i++) + { + myid[i] = i; + pthread_create(&tid[i],NULL,sum,&myid[i]); + } + + for ( i = 0; i < nthreads; i++) + { + pthread_join(tid[i],NULL); + } + + for ( i = 0; i < nthreads; i++) + { + result += psum64[i]; + } + + if (result == (nelems*(nelems-1))/2) + { + printf("Correct result: %ld\n",result); + } + else + { + printf("Wrong result: %ld\n",result); + } + + exit(0); +} + + + +void *sum(void *vargp) +{ + int myid = *((int *)vargp); + unsigned long long begin = myid * nelems_per_thread; + unsigned long long end = begin + nelems_per_thread; + unsigned long long i,lsum=0; + + for (i = begin; i < end; i++) + { + lsum += i; + } + + psum64[myid] = lsum; + return NULL; +} \ No newline at end of file diff --git a/exp1/task61 b/exp1/task61 index 1b8468a66e3ee244cda18fffdf2470ef0938bcd9..6337b1d6cac15223f7798cc7a35efb78dfc276f9 100755 GIT binary patch delta 2254 zcmZ`*du&rx7(eIsv9^q^ck667Hg-n}+d|f^^4NnF+I5dRz{mt*B9AfmfI1jt>kN>^ z4hF@Py!LgOCiGbJNGdj;%UzLzVG+_ zzVCeJo^$T)$PgXqr320al1}92R|Hv6rYb1>q>NZ`%p)`7OX3!%NpU$%@!#EMuU@gd zz*7%6f;=?P@A#wn3OXeri!0zKRCG#01ENzLEe4{9t`d|CQxe9wkL`^ITtA-Cm00ez zA8$J>HVKdJ9{2#ly0x?c&g&fXFf{2MgL;wvjEVP%{ zZfM3yX2B$9hkV1V)W*hbouQ6!TVwO4cBnE0GdG9cY<72TbuT1!%j>IxjW4_Bx#z=> zp({d&ju;4s;T&r0#~LMi(uvY0TZDwOLS}-z9u>2PLemLy-c{}HZ06UILDl{?e#po& zex$~4_bH0{#L0xZOTDnem_~;oYFtB&aK(6#rX;#k+D+fsT4+SW&Uy>y6DerwT*5fiE?+fH5cgrAJ*W@VXvn976h~X~p{bZ-C zVgTxGs%}I54Oy>tIa|cJdNxlE=}z&EihU;w$CHmAOH!LVEpLy!jI=yIH1atO0Su8c z6UBtwec}{jzTXfLV}=V%l>Z&h6#ET_n7(&3Y?da{@_Jd8aaAJ!u*_fZX)&DPXK<~> zaE;F`YDJKA&s{C{`Kp*IMz4fZ#eQEc8p#KbBq`Z~v;Si7fhRpXq9(hOHuK@i9}J8h z^XaA|^E6}DVEJP6x#*Y}y0EdWt!?ZQy?Mt|~-CQA`bb~2i_rpgyC%8wLQ!&BC3 z|B-G%iK z$Q9-+BXovtk%$&M*Jo}@61yLpZ%NW;D0@&IN0~Y)No9Bzze3r9_J_A6=_1M-C~u*x zydz1e6h0SbW%-dZ2O(0OBHuh0s`Igna9JpbjN$~^g=8c<_AvJE5g%ZH+MFo&V;{wA zwG6AV+WI)oZ^bH^Zv^|@7x)ShKZ(5%3j>raZXXx0I{S3h))KBTVzD}dR$IVo3QUs| zvFh2X*{vrcQubJwFL5OQ)U-jJDNDQM!|H9vhak63h!^Kk7aS{&&_BWJZsh$biboZs z7d~;nN=snUoyS>?iFA*P!fh@aUwQ(afIxWx&4K)KM|}Z?arjOzQD;!H5K^S#8=k`} zRa~n`YDc*W~< zA6%>0h^uZ`R6N&81~L@3{Gd_o!H1KME4igsEN>j*dthvlgT~=}g#+J{lc;|U=1Nb~ zapc=bHgWouJlgo4ng^4~O+HSjjj4Q_U%|EUtjgcOE6AYgxBwLAy3R(g0dF9y&9Bz1 z)ixb*p35T7=gfl3l@2-&c%OqVW20dmGTG-TgKmcaqVF&iw)rwl;ij(kgF<~SsV`Py)sho<5K`(ABLRWp+2PAG;8InN#cEW_wio z+EVk>Hy;9MP5mE8?5e#=<45&yqu$P!l_(LL^oq;{eyPViJYTU6LjBTGi>FkvvME@q GX8sFvQAdXW literal 19112 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 diff --git a/exp1/task61.c b/exp1/task61.c index 67dee6d..8560f8e 100644 --- a/exp1/task61.c +++ b/exp1/task61.c @@ -31,7 +31,7 @@ void *wokerT3(void *vargp) for(int i=0; i<5; i++) { time_t t = time(NULL); - printf("Current time %s\n",ctime(&t)); + printf("Current time %s",ctime(&t)); int sleep_time = rand() % 5 + 1; sleep(sleep_time); } diff --git a/exp1/task62 b/exp1/task62 new file mode 100755 index 0000000000000000000000000000000000000000..0bb620fb759c70408c79a6ba52eca12c59213498 GIT binary patch literal 19088 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 literal 0 HcmV?d00001 diff --git a/exp1/task62.c b/exp1/task62.c index 717bcd1..2a3c4f4 100644 --- a/exp1/task62.c +++ b/exp1/task62.c @@ -5,51 +5,29 @@ #include #include +void *increase(void *vargp); +void *decrease(void *vargp); int cnt = 0; sem_t mutex; -void *increase(void *vargp) -{ - unsigned int niters = (unsigned int)vargp; - for (unsigned int i = 0; i < niters; i++) - { - sem_wait(&mutex); - cnt++; - sem_post(&mutex); - } - return NULL; -} - -void *decrease(void *vargp) -{ - unsigned int niters = (unsigned int)vargp; - for (unsigned int i = 0; i < niters; i++) - { - sem_wait(&mutex); - cnt--; - sem_post(&mutex); - } - return NULL; -} - int main(int argc, char **argv) { unsigned int niters; pthread_t t1,t2; - + if (argc != 2) { printf("Usage: %s \n", argv[0]); exit(2); } niters = atoll(argv[1]); - + sem_init(&mutex, 0, 1); - pthread_create(&t1,NULL,increase,(void*)niters); - pthread_create(&t2,NULL,decrease,(void*)niters); + pthread_create(&t1,NULL,increase,(void *)niters); + pthread_create(&t2,NULL,decrease,(void *)niters); pthread_join(t1,NULL); pthread_join(t2,NULL); - + if (cnt != 0) { printf("Error! cnt=%d\n", cnt); @@ -60,4 +38,28 @@ int main(int argc, char **argv) } sem_destroy(&mutex); exit(0); +} + +void *increase(void *vargp) +{ + unsigned i ,niters = (unsigned int)vargp; + for ( i = 0; i < niters; i++) + { + sem_wait(&mutex); + cnt++; + sem_post(&mutex); + } + return NULL; +} + +void *decrease(void *vargp) +{ + unsigned i, niters = (unsigned int)vargp; + for ( i = 0; i < niters; i++) + { + sem_wait(&mutex); + cnt--; + sem_post(&mutex); + } + return NULL; } \ No newline at end of file diff --git a/exp1/task63 b/exp1/task63 new file mode 100755 index 0000000000000000000000000000000000000000..7a7c4af911f9824d4ae0c10dea2d2c248b39e7c9 GIT binary patch literal 17008 zcmeHOdvIITnLm>4AW|cXN5F(fL~y7BiLmlo2jWEXBe@0#Ok&fpAtmMKkPQ?4L^@MuT_iT3xM zdp_y<)?y#i{i{A6`8(h5dz^E=dmi`Pd(WsEHn zSDB9OG^)yD%H`b#JBsK3G;#M>r^>5z{qpMiF;$mE#_}Q*MwfNXExqE3C)*GH$+<6o z@BYE1%WnI|jMK+%_@V#$M7(d=lIs)Eg^Bo3X4}GT&C3=pTjEP6eTxLSrJ+auWW62t zBPX1MU5wvLu@?uIf0W~4L9$6{Ik*cZAtv)c1$+hy@=l@uXBG6%tAJlt0sp58_~RAu zxfSZOvVwkh1$<`(d_e`AVm4LWHdnxt6>xur`nOfkhx(M|{#6D1N#Jwwv!}-ZoG)ez zZ@`rBI2GyGU?>_(>#5{+F`UuU5{M7QbrA}s^>AcsC^E1$)E|x~01T(%LwY|UqCXXj z2|Yd-6T|vIDi)50zM6~=K_{M0MiwoGZAwojO2P2NZw3$musu}rM#>TGQbE%Gh) zEh*=lOIZt8&MxvT6`{_awTMD0wk4j{W2v6CZHeSitS8);pek<}Ob)5qg-q2c6%kmc z9M@H#)yUCUbz)UN9wK%HyzmxJR@qywqv&r5mPJ^e!>k41*%`{0MX=>eI+^cX`K#B$9%)hqE#HkI` zE>1@*IL&FC3=6K7PANKJ!Ov%9&{Gy%-C9T~_g7k*RTU+^LFu0Zj>ZV5%@&;Jc#;iR zaJkMagJBC!ZR51ff>RlsMl3kTh-430aCM6zO~x(wm)HsDJ_}xJ!S`EmnoBu7VZq%D zf<9%z>n!-w7M%MQiSriRI-mW-f?sIybJ&8@x;34qBQPC-=?F|m;P)c}AJ<)ZS{ps) z(sDJgUys{{2lKkKcvu^K&NU$eP+U3}aB*G({@2Y32+|)QN#U(xvDiN@d0LdKz+zfm`5gxsvnUNbu3Fdl_cFnd>RSN2147CD?f z)H!;{qm3SPY4Ml0^!N84I6Fr>aQdqGANfy?UG&KO!wBbo1Zp(zaMWzUE;pE6eadjd zP5biqGT$Fv(IDx})@O0($2ABW1DsS|lqbqy0mVLb|`)PKo3tn!*Xhq{kCp;+8 zW&F#TV)4cW4VhPEbsJG#{~P`NzPdRNP<2ITZpAO8w!=68&EWE%?>hD@E@lz&GIn90 z%aRwOH#BIut_Ihr;n1=_)yD2T;F9A<%k7k<9dsG@!(KyWk0J1Xjv;I0Kc_1?>zCJ2 z$d`T}kU#$;*-9h<}b-+dClV>dK~`F!;m+IA?wN(4NdBN z4cBI+%GDc7RL)~uE4AJ+9zh&nc_UmHCxQ9%g%FCR_SEhD0RmfU=00c^)}YN$kD?~V zIZ%J^(UN={$xp+=IQtpqkW%b;KJ_2(%)WG&mVHYb{m&EKJstkM|DWONyYNz+wfI^g zJ}KJ(zXOOiRBXOOx+h#9#i+Z#UtvvPACff`BH!BTq5(&YS|Oof%jKw2ToOK zjzii@XZ4HV;OKnQfvb4LoY&Z%=J%17GZ2f+b-mhX%a19mWsmB$7{`ae7=_blSrm0W zRP!_Nj!m!?R{O#|5UTo+zuX$vgZa9LUxFi=I6C~tgFT(u&wJOy&iGS=s57^qA&8!- zMPB>17JuWFwS69KY-h7};InJyzY>4NKs@Ik&Q2J6Q8EPe#%{_)dQqhggl1=b_VV#u zM=i#}w?EzK%J$Y8kD8hrj6E{b5~GTDoB2DC*CG>|qvjq$zX~*%>uIRXzApRLn^AE@luK%RbuG~X^ga74?{*#*uen9emL%PqcGDc2O?9lwLC`;oO zGqYi1f$VvF1$%w$>ZHWQrEAB^u!tw`Uv1CpUMKS;PivW1$<2yq8bK1xX@H=HfAD|HOS!v1_1e!_g|$uE`ZZ%Is(%Xn2x}71g0bK z{~Q4ap7w9-P9>w6NG#=@7v1C?Hkl}xnPOvGawwe{RHBH2!Z4aYMQKDA_w0)*}P4w6|1ofY_QNO|qxAU$Lmo zHkyRtP*OLY*j+d-tGY1?Ke*i&#{0!0ZE;V1P%P#_T_=jg*NA>tELPLz^^;<81bp+a zi^UV5jVFu6CTyhYKP?sqK(~R8gFXTJBx5&Q$8lNhIWE#AoL&Ow zKQ0!pA;tD{u;+2(mk#bv1<16YZo`n1uE_D1Z_f{t?v)W zuZ~|MaO;bg6~Ol37eHIy1{JrtJr6ru-SuNt9d7TQ>UMYI?wX*xX>^A3Z{3Y;ZZAZw zZcnS*b@Rlb7k>I8)#(NNPQderb~_;+t-8(a-R`bm7lMH3= zakjhbcUJ}7-qGrv?)spts?yb=TaRnBwxo;llr9y`${OVRq5C;vy$E{}^1GMX^l(+H z+dEd>>TcXaG1)yM=x!c8=O*_Nhx7KC?q)z}E>ub}3Q{+c2|H%t#g86|(f0%BK6%2( zJtgOe$)i}ANJiI>c+#gty0lH6PSX*Xj=*#TrXw&Nf$0cLM_@VvzxxRA_g4IU72lUV zr;4iOBGpayd5Ryo)XXSS`i_gfqohRlt(0b)r1U)(fB4DrU!N@|No8E!Ao90QM^uKt zd3svOdH-~?swm%h()}|f>$h3N^L=MPeJ8~Cl_ScY_6wBw8>&l8R_s$1WIV4jTyNSR zQ99Qo^8TH&S1O+M@HRlU55-9cZ&4(_S^2{QYL-h&Y`rAEK*{kKSn}Ks<^Fd@_`7Vo z!zOjT1B!Mlx>?a-MMo4JS9HIkPbr#L^su5w6g{CRKKhi&qo~*V(Ve|gU%&W>HkCg0 z^QrJJ19#%|!Be)5iZ?eBKVrja-%9#CKEcYg4*wk(U5x>gSKV3MCGm?(ODO7(wA>R%upx|%i1bgK3~EA=lC_I~!fG&^7Lckt|mz9V&DH1T+4 z`~)%=p#H<^Bg?my;5QOytumd7fLOmDWXYF-dzrD&cO;J4EMNhVZ39lT8DXG@JPK4HU-P#)L z3f;PT_4h8jkG^zT)k7W#u^v4ssnaPBI=(`!DT7OFXHKjVgfBFh(PPy6%=Z>%L{hQA z#&T+<><`7ugCkR(2C<%sDVxAz(jk_TL|$*SMIFT{;dIU9 zVVDv^n!=afKB$NLKyl1Q(gDull|;<9Whmq8%fxYnEFKj;9NLMchJ{22!s!9wi*6r+ z2b1b4Q*w7KmBxFTNlXZ`R4frD1C<+2=;RTna(u}8wj@<19g7GbLJO7#F0_-fpZa10 zYN!rG;f*=rD^(O@Z5UzRuApFR=R%raWFh9DHeGTabqNo~QJU!=T}AjXn+#%-`0WYp ze~Hlkina!ru4SrpPEv_+4>~!~+apY^CHqR}R@sVlt!Wt;yjnzFnw0d4=NY_?a+mC%4;2`Jg~K9MQ!3!x&Dz5cY`(VmOT=Y1Aa^X(el zyPJvim~H}0dpPEKA6KHv&R%~7iv%*{o9**zpU3nyrO4&m+kdyRZ&iA{Ph~oy8cg;S zGrRo=FjC=tHQkEIq$uy-6qc{TT>o z?65uWYx%tU2^BvY|CHE{`_VUnkqX=MJ~wbZX$z5;|I7c_o++Jow%Ut;(p7=ya@Ygg zF<%Q~!nk~Iz?68D{V*#k>b3FbtMZk4Ny_%uln^sRb){sb+;>fh`M+5?JgfqD1z;MQ qTz{Vb={XG7-Ly3SyJ%rTde|o9a!o1i9j3N_Y`Lj1+h$;6#eV_u4?~#% literal 0 HcmV?d00001 diff --git a/exp1/task63.c b/exp1/task63.c index e4e3a28..3387ad4 100644 --- a/exp1/task63.c +++ b/exp1/task63.c @@ -1,3 +1,10 @@ +/* +编写一个多线程程序task63.c,创建k个生产者线程和m个消费者线程, +每个生产者线程产生若干个随机数,通过由N个单元构成的缓冲区,发送给消费者线程, +进行输出显示,产生Pthread信号量实现生产者/消费者线程间同步,并且设计一种方案对程序正确性进行验证。 +提示:一种非严谨的简单验证方案是,将生产者线程产生的所有随机数相加得到一个和,消费者线程接收到的所有随机数相加得到另一个和,验证两个和是否一致来来验证程序正确性 + +*/ #include #include #include @@ -5,3 +12,181 @@ #include #include +#define POISON -1 + +typedef struct { + int *buf; + int n; + int inpos; + int outpos; + sem_t mutex; + sem_t slots; + sem_t items; +} sbuf_t; + +long long produced_sum = 0; +long long consumed_sum = 0; +sem_t sum_mutex; +int total_items; + +void sbuf_init(sbuf_t *sp, int n) +{ + sp->buf = (int *)malloc(n*sizeof(int)); + sp->n = n; + sp->inpos = 0; + sp->outpos = 0; + sem_init(&sp->mutex, 0, 1); + sem_init(&sp->slots, 0, n); + sem_init(&sp->items, 0, 0); +} + +void sbuf_deinit(sbuf_t *sp) +{ + free(sp->buf); + sem_destroy(&sp->mutex); + sem_destroy(&sp->slots); + sem_destroy(&sp->items); +} + +void sbuf_insert(sbuf_t *sp, int item) +{ + sem_wait(&sp->slots); + sem_wait(&sp->mutex); + sp->buf[sp->inpos] = item; + sp->inpos = (sp->inpos + 1) % sp->n; + sem_post(&sp->mutex); + sem_post(&sp->items); +} + +int sbuf_remove(sbuf_t *sp) +{ + sem_wait(&sp->items); + sem_wait(&sp->mutex); + int item = sp->buf[sp->outpos]; + sp->outpos = (sp->outpos + 1) % sp->n; + sem_post(&sp->mutex); + sem_post(&sp->slots); + return item; +} + + +typedef struct { + sbuf_t *sp; + int num_items; + int id; +} producer_arg_t; + +typedef struct +{ + sbuf_t *sp; + int id; +} consumer_arg_t; + + +void *producer(void *arg) +{ + producer_arg_t *pa = (producer_arg_t *)arg; + for (int i = 0; i < pa->num_items; i++) + { + int val = rand() % 1000; + sbuf_insert(pa->sp,val); + sem_wait(&sum_mutex); + produced_sum += val; + sem_post(&sum_mutex); + printf("[Producer %d] produced %d\n",pa->id,val); + } + return NULL; +} + +void *consumer(void *arg) +{ + consumer_arg_t *ca = (consumer_arg_t *)arg; + while(1){ + int item = sbuf_remove(ca->sp); + if(item == POISON){ + sbuf_insert(ca->sp, POISON); + break; + } + sem_wait(&sum_mutex); + consumed_sum += item; + sem_post(&sum_mutex); + printf("[Consumer %d] consumed %d\n",ca->id,item); + } + + return NULL; +} + +int main(int argc, char *argv[]) +{ + if (argc != 4) + { + fprintf(stderr,"Usage: %s \n",argv[0]); + return 1; + } + + int k = atoi(argv[1]); + int m = atoi(argv[2]); + int N = atoi(argv[3]); + total_items = 0; + + srand(time(NULL)); + sem_init(&sum_mutex, 0, 1); + + sbuf_t buf; + sbuf_init(&buf,N); + + + pthread_t *producers = malloc(k*sizeof(pthread_t)); + pthread_t *consumers = malloc(m*sizeof(pthread_t)); + producer_arg_t *pargs = malloc(k*sizeof(producer_arg_t)); + consumer_arg_t *cargs = malloc(m*sizeof(consumer_arg_t)); + + for (int i = 0; i < k; i++) + { + pargs[i].sp = &buf; + pargs[i].num_items = rand() % 5 + 1; // 每个生产者产生1-10个随机数 + pargs[i].id = i + 1; + total_items += pargs[i].num_items; + pthread_create(&producers[i],NULL,producer,&pargs[i]); + } + + for (int i = 0; i < m; i++) + { + cargs[i].sp = &buf; + cargs[i].id = i + 1; + pthread_create(&consumers[i],NULL,consumer,&cargs[i]); + } + + for (int i = 0; i < k; i++) + { + pthread_join(producers[i],NULL); + } + + sbuf_insert(&buf, POISON); + + for (int i = 0; i < m; i++) + { + pthread_join(consumers[i],NULL); + } + + printf("\n=== Verifcation Results ===\n"); + printf("Produced sum: %lld\n", produced_sum); + printf("Consumed sum: %lld\n", consumed_sum); + if (produced_sum == consumed_sum) + { + printf("Verification successful: produced sum matches consumed sum.\n"); + } + else + { + printf("Verification failed: produced sum does not match consumed sum.\n"); + } + + free(producers); + free(consumers); + free(pargs); + free(cargs); + sbuf_deinit(&buf); + sem_destroy(&sum_mutex); + + return 0; +} \ No newline at end of file diff --git a/exp1/task64 b/exp1/task64 new file mode 100755 index 0000000000000000000000000000000000000000..b5000305cab9ddb143bf69fd43bf8a81ddb11d48 GIT binary patch literal 16384 zcmeHOeQX@X6`%75F(LIiX#)9Z$r3I!eE8x^9AiU1?i@Q=Q#)}J2Z9Q0&Ub73$obB_ z+XI`A)?h%n8iPSCN+r}rRgqE^sZm?1fDl{~NTGiq2ogvCV`f0-DL2Prf>aQ!rwl+))Qd{^ zUMwya=Yd=%IjcNq0hC&)s&q0|5RWw48C34XuaO=jw-6ESrb|a>SS5_2%97Ep9J3@l zae$mMa(SUX1&tvo^1Fy7Bs1FT!`SSqw#s*{aUkh$r|akXkVd=RWVf5_7$>knkQh0h z*nIr7lRqc=&S98~&%R4g`aITHv|x1BH%4|&RLG8z>)ZOS5&d84YbU#Ya_Gb+ zs*jQD`xe+?Jpa?g!($88H(merQ~xnix5!w|h03rSHg4J`N`Jjz`;zysy|nE}u z|4HDNIF(V>w6qb9?9?JXJGHKGEDl6pDwZ(1kP&)+%n;qWVZ?g%WLGpiAo`4+lpc<1 zw&krgY!N6JXX3xyF-F?1+~o{eAyDMRZGOM^&%SnG-m zwWV>rw!**CUt7%A7qTn-s|tCWLaoqRI@+|Tp3=KxX+uwSw5^XP6M9FuGmh1F_a+lm zy=JLSsR&`faaJlvYdMUw5}Ctq4?HEm3uSyC7z<+O<4D{^-2O)%gJD@Nen4_&A(oek zpO8E^7W)c%{sqauk@_X#DUdPobC91Sd%kM%qx76(eh2XtL93j3mXEHpc)Uk&409T@ z@pOyIqP&flzXN12VdH1A6Tq`J9`8p^dx*!M8GdwQ*v-~5y1zc}PK9P%p;`LIKN z&LRJHk{r4rbbV-BsAJn!HG5LM=U5(^7gdMLmM(*gn!V3=6flq*GE0p`>hOinL-z?cXtB7rloXxLB{Ug}}E!h`aUVo=G zJJy=@`C87LQM2WbK%??Ef%6mI*-gHRw);)v?$!~**RGDleN}-!wPjCrjb?9#7LB)N z-&05CjX@=W)9TP6k2>^XSqt=O{hgOR-v=!gqP6rIb?9J)+Hf#)3PRv(%8oxHulM!0)uB98^u9-Z zee7xMLDl=qgMlOJnd7b5Pg@(#8rMQhUV+7dj87n!4?|n>4?-JHcyEI1;jldqD*I)4 zf}jAgyAc3P@3xs<2Gj?KcsvF^Y{|ZMi<*TNyfe|>(HzJHURFoegh0uhck(JBP8Hh^ z{DNxip7J>e(5!hd^xps_9Qx;*W8TGsc%9%}BIu7};mE4D5iUQcW+&7GAFWdloGn#7 zht=248FRtG6Xc-69JAue_IQ5`u6YWIMdr$F>d=~dF{@_ZHD;;9YaRe0zu+^7LloM2 zxO@a;&&^<4s2}aeZ->I-B@}a@hvjNyojSZK1-20G>{*EWVQgB%M0)P1nmqvWOX^V0 zqk4X?HXP1;2-n^Px@var*+5PP(bm7x-_WsTfzvR;SJMc;%Qs)mzLy{UCp5$RaSlE& zpHRJ5K&K(h@}2PBQhwnl} zlN$jy0&WD{2)Ge&Bj85Bjer{gHv(T;1U&LhkPzF_;copJWocSjov_|`rPnH}F< zp~v;!^xBzXeKM8OBZiXF)0wydy772srnn)MOmsWA4tRT}7~!3I0<^l6v>r(&qUplx zmBIV`A{5aM^@u?g6X^+>bmUzT8nynC1?U)sv?AD&TIwcK|Wr zyH-q|JGKZj;q}bl~oUyG*-@ksI;+C87XV5T=rmjsIumP^Fo#NLo=?c z+=HuZ>s`G9h<};j`(|+4I7;aB^F?w+(9+nre*HDd zvTdE2gppAKtNbhcHPwN-jFbbH6Z3DJVf@O(anq@S{o{dEHSZHwNCCHbPNk3Ib1MED zz?Z=3g9*o`-^+EJAVYcVylm{dx4)_vOw^C!2DCd z&w+l=(YOjx!PBS@H3-Eb=rJi?lKO02#J>Vx1??XT7CFp4D)qrX1>-U*&Xc|pB!b`+ z=_|7>LjHFI*-s=tSr?@_B~!=ws%iK&z+)Vo{n!G$@_F|nGL4@*fnPF({$r?L0>2*4 z=hW6n$_V(Au!%j~8Pkk#w=lx#op3B7BA_H~WMGp*L=<)0Q zP-APeCi>Eu-a6RM?>sROEF28@g1!EFG;D;0yawN$sSw3}~4uZP^4@gXT>VX~NNsfZ~ zO6&vs8I3}Tbd3Ejgg-sdYlJ%i;n;`79?m6_hVJi9Wc;0(7#!${MTH*@ljx~FA=#dA zx<~k<0}1e8p^>smZqrlgSTZq5(4Z`($HQnqxxTo89-$R}$ojjJl!5=$h2PNoLBwGU z+DSPe{CW=!+@2_SV@dc64ed)Mq0@~4qC$-=)p)nbN~|Gnx#T>wCEOc>+AROjeZmj- zRxjK#Q{3PGErs(`oZG=;L8j@>tx>W3Kb!N2uuo0Eqpx5;-8n+k#e}-{R0qOonA>sv zJpX0%kupEu`FDqX1R;ZSU$*D@F=IVdh|@^SvOUjJRp4+=$@V<=^ zcV&B?uQKwypWDxRjCfuQ=fW)We3)^EtkrtoU~fOsA`Th!&GtM$XUvfz*YCXk+sM9= z^mx9{xYuTnF>~4v0*CG5^-1A(g??Xn9Rw;eaXVPP6Eb#th3psyS&@)`wiq99*zchN zM%H6DEHggru-``ojD2iK$aajo9ripgVEm?I!J;_){n%m8^E5_YXR?_yem^67?th_> zCSgB`4BUS#KM5I(Kil(sma&Ny37z#n*)cfle*p^Y&mZSG*cvt@blU&H zVbALuM#W+8Z2!AZ4*P@)@9+409G^RN*2gmAaj^B;?0MZX3cFh|v7RLrW#&JF0=##4 znD9D-&mZ$SV_F6m{PFnvKG}P|Ef^ALjyWD<(Vg*tJTm?|O3BP96SrpmB=N p*Nx9IOt>!Qwo8J(cGX&$#~seOUe?8Bz*P3Wt1XR%4g-fM{so_X%isV2 literal 0 HcmV?d00001 diff --git a/exp1/task64.c b/exp1/task64.c new file mode 100644 index 0000000..03c405f --- /dev/null +++ b/exp1/task64.c @@ -0,0 +1,89 @@ +/*任务4(必做):编译、测试和运行示例程序psum64.c +1)测量线程数为1、2、4、8、16时程序的执行时间,计算加速比和效率,并做出解释。 +2)改写该程序psum64.c,保存为task64.c,实现计算02+12+… +(n-1)2功能。 +*/ + +#include +#include +#include +#include +#include + +#define MAXTHREADS 16 + +void *sum(void *vargp); +double get_time() +{ + struct timeval tv; + gettimeofday(&tv, NULL); + return tv.tv_sec + tv.tv_usec / 1000000.0; +} + + +unsigned long long psum64[MAXTHREADS]; +unsigned long long nelems_per_thread; + +int main(int argc, char **argv) +{ + unsigned long long i,nelems,log_nelems,nthreads,result = 0; + pthread_t tid[MAXTHREADS]; + int myid[MAXTHREADS]; + + if(argc != 3) + { + printf("Usage: %s \n",argv[0]); + exit(0); + } + nthreads = atoi(argv[1]); + log_nelems = atoi(argv[2]); + nelems = (1LL << log_nelems); + nelems_per_thread = nelems / nthreads; + + double t_start = get_time(); + for ( i = 0; i < nthreads; i++) + { + myid[i] = i; + pthread_create(&tid[i],NULL,sum,&myid[i]); + } + + for ( i = 0; i < nthreads; i++) + { + pthread_join(tid[i],NULL); + } + + for ( i = 0; i < nthreads; i++) + { + result += psum64[i]; + } + + if (result == (nelems*(nelems-1)*(2*nelems-1))/6) + { + printf("Correct result: %llu\n",result); + } + else + { + printf("Wrong result: %llu\n",result); + } + double t_end = get_time(); + printf("Time taken: %f seconds\n", t_end - t_start); + + exit(0); +} + + + +void *sum(void *vargp) +{ + int myid = *((int *)vargp); + unsigned long long begin = myid * nelems_per_thread; + unsigned long long end = begin + nelems_per_thread; + unsigned long long i,lsum=0; + + for (i = begin; i < end; i++) + { + lsum += i * i; + } + + psum64[myid] = lsum; + return NULL; +} \ No newline at end of file