创建子线程产生斐波那契数列问题!

创建子线程产生斐波那契数列问题!,第1张

以下是一个使用pthread多线程编程来生成Fibonacci序列的示例程序,注释中有详细的解释:

#include <stdio.h>

#include <stdlib.h>

#include <pthread.h>

#define MAX_FIB 100 //定义最大Fibonacci数列长度

int fib[MAX_FIB]//存放Fibonacci数列的数组

int fib_len = 0 //Fibonacci数列长度

//计算Fibonacci数列的函数

void *calculate_fib(void *arg) {

int n = *(int *)arg//获取Fibonacci数列长度参数

int fib0 = 0, fib1 = 1//初始化Fibonacci数列的前两个数

fib[0] = fib0

fib[1] = fib1

for (int i = 2i <ni++) {

//计算第i个数,即前清慎两个数的和

int fibn = fib0 + fib1

fib[i] = fibn//将第i个数存放到数组中

fib0 = fib1 //更新前两个数

fib1 = fibn

}

fib_len = n//更新Fibonacci数列长度

pthread_exit(NULL)//退出线程

}

int main() {

int n

pthread_t tid//线程ID

printf("请输入要产生Fibonacci序列数:")

scanf("%d", &n)

//创建子喊正团线程,计算Fibonacci数列

if (pthread_create(&tid, NULL, calculate_fib, (void *)&n) != 0) {

printf("创建子线程失败!\n")

exit(1)

}

//等待子线程结束

if (pthread_join(tid, NULL) != 0) {

printf("等待子线程结束失败!\n")

exit(1)

}

//输出Fibonacci数列

printf("Fibonacci数列:")

for (int i = 0i <fib_leni++) {

printf("%d ", fib[i])

}

printf("\n")

return 0

}

在主函数中,先读取用户输入的Fibonacci数列长度n,然后创建一个新的线程来计算Fibonacci数列。在子线程中,先计郑橘算出前两个数0和1,并存放到数组中,然后从第3个数开始计算,每次计算前两个数的和,将结果存放到数组中,同时更新前两个数,直到计算完n个数为止。计算完毕后,子线程将Fibonacci数列长度和数组返回给主线程。在主线程中,使用pthread_join函数等待子线程结束,并将Fibonacci数列输出到屏幕上。

1、首先打开vc,点击文件、新建;

2、选择win32 console application 并在右侧输入工程的名字和地址,确定;

3、选择一个空的工程,完成。

4、再次点击文件、新建,

5、选择c++ source file 并输入文件名字,确定,

6、输入如图所示的代码,这里以前十个斐波那契数列数姿搏为例,需要输迹禅祥出其他个数请把5改成对应数字的一半(比如要输出前20个,就把图中的5改成10);

7、点击右上角的编译运行按钮。

8、成功地输出了斐波那契数列的前袭启十项,如图。

DATAS SEGMENT

STR1 DB 'Please input a number(1-100):N=','$'

STR2 DB 13,10,'FIB(N)=','$'

WRONGSTR DB 13,10,13,10,'A number between 1 and 100 please!',13,10,13,10,'$'

INPUTBUFFER DB 3,?,3 DUP(?)

N DW ?

RESULT1H DW 0

RESULT1L DW 0

RESULT2H DW 0

RESULT2L DW 0

C10 DW 10

OUTPUTBUFFER DB 11 DUP('0')

DATAS ENDS

CODES SEGMENT

ASSUME CS:CODES,DS:DATAS

START:

MOV AX,DATAS

MOV DS,AX

CALL INPUT

CALL FIB

CALL OUTPUT

JMP QUIT

INPUT PROC

JMP T1

WRONG:LEA DX,WRONGSTR

MOV AH,9

INT 21H

T1:LEA DX,STR1

MOV AH,9

INT 21H

LEA DX,INPUTBUFFER

MOV AH,10

INT 21H

MOV AX,0

MOV CL,INPUTBUFFER+1

MOV CH,0

LEA BX,INPUTBUFFER+2

T2:MUL C10

MOV DL,[BX]

CMP DL,'0'

JB WRONG

CMP DL,'9'

JA WRONG

AND DL,0FH

ADD AL,DL

ADC AH,0

INC BX

LOOP T2

CMP AX,0032H

JA WRONG

CMP AX,1

JB WRONG

MOV N,AX

RET

INPUT ENDP

FIB PROC

CMP N,1

JZ L1

CMP N,2

JZ L2

DEC N

CALL FIB

MOV AX,RESULT2L

MOV DX,RESULT2H

MOV CX,RESULT1L

ADD RESULT2L,CX

MOV CX,RESULT1H

ADC RESULT2H,CX

MOV RESULT1L,AX

MOV RESULT1H,DX

JMP EXIT

L1:MOV RESULT1L,1

MOV RESULT2L,1

JMP EXIT

L2:MOV RESULT2L,1

DEC N

CALL FIB

EXIT:RET

FIB ENDP

OUTPUT PROC

MOV AX,RESULT2L

LEA SI,OUTPUTBUFFER

MOV CX,5

R1:MOV DX,0

DIV C10

INC SI

ADD [SI],DL

LOOP R1

MOV AX,RESULT2H

LEA SI,OUTPUTBUFFER

MOV CX,5

R2:MOV DX,0

DIV C10

INC SI

PUSH CX

CMP DX,0

JE NOADD

MOV CX,DX

ADDN:CALL ADD65536

LOOP ADDN

NOADD:POP CX

LOOP R2

LEA DX,STR2

MOV AH,9

INT 21H

LEA SI,OUTPUTBUFFER

MOV BX,10

R3:CMP BYTE PTR [SI+BX],'0'

JA PRINT

DEC BX

JMP R3

PRINT:MOV DL,[SI+BX]

MOV AH,2

INT 21H

DEC BX

CMP BX,1

JAE PRINT

RET

OUTPUT ENDP

ADD65536 PROC

ADD BYTE PTR [SI],6

MOV DL,0

CMP BYTE PTR [SI],3AH

JB A1

SUB BYTE PTR [SI],10

MOV DL,1

A1:ADD BYTE PTR [SI+1],3

ADD BYTE PTR [SI+1],DL

MOV DL,0

CMP BYTE PTR [SI+1],3AH

JB A2

SUB BYTE PTR [SI+1],10

MOV DL,1

A2:ADD BYTE PTR [SI+2],5

ADD BYTE PTR [SI+2],DL

MOV DL,0

CMP BYTE PTR [SI+2],3AH

JB A3

SUB BYTE PTR [SI+2],10

MOV DL,1

A3:ADD BYTE PTR [SI+3],5

ADD BYTE PTR [SI+3],DL

MOV DL,0

CMP BYTE PTR [SI+3],3AH

JB A4

SUB BYTE PTR [SI+3],10

MOV DL,1

A4:ADD BYTE PTR [SI+4],6

ADD BYTE PTR [SI+4],DL

MOV DL,0

CMP BYTE PTR [SI+4],3AH

JB A0

SUB BYTE PTR [SI+4],10

MOV DL,1

A5:ADD BYTE PTR [SI+5],DL

MOV DL,0

CMP BYTE PTR [SI+5],3AH

JB A0

SUB BYTE PTR [SI+5],10

MOV DL,1

A6:ADD BYTE PTR [SI+6],DL

MOV DL,0

CMP BYTE PTR [SI+6],3AH

JB A0

SUB BYTE PTR [SI+6],10

MOV DL,1

A7:ADD BYTE PTR [SI+7],DL

MOV DL,0

CMP BYTE PTR [SI+7],3AH

JB A0

SUB BYTE PTR [SI+7],10

MOV DL,1

A8:ADD BYTE PTR [SI+8],DL

MOV DL,0

CMP BYTE PTR [SI+8],3AH

JB A0

SUB BYTE PTR [SI+8],10

MOV DL,1

A9:ADD BYTE PTR [SI+9],DL

A0:RET

ADD65536 ENDP

QUIT:MOV AH,4CH

INT 21H

CODES ENDS

END START


欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/yw/12405555.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-23
下一篇2023-05-23

发表评论

登录后才能评论

评论列表(0条)

    保存