рд╢реБрдн рджреЛрдкрд╣рд░, рд╣реНрд░рдЬрд╝рд┐рддрд▓реА! рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдореБрдЭреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрднрд┐рдиреНрди рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦрдирд╛ рдерд╛ред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдХрд╛рдо рдХреЗ рдЕрдВрдд рдХреЗ рдмрд╛рдж, рдХреБрдЫ рдЕрдиреБрднрд╡ рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ рдерд╛, рдФрд░ рдореИрдВ рдЗрд╕ рдЕрдиреБрднрд╡ рдХреЛ рдЖрдкрдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдореБрдЭреЗ рддреБрд░рдВрдд рдпрд╣ рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд▓реЗрдЦ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ рдореИрдВ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдереНрд░реЗрдбреНрд╕ рдФрд░ рдХрдВрдкреНрдпреВрдЯрд░реЛрдВ рдХреА рдмрд╛рддрдЪреАрдд рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реВрдВрдЧрд╛ред
рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрдпрд╛рди
рдмреЗрд╢рдХ, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ, рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рд╕рд╣реА рдХрд╛рд░реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдереАрдВ:
- рдЧрдгрдирд╛ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдХрдИ рдорд╢реАрдиреЛрдВ рдкрд░ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП (рд╕реНрдерд╛рдиреАрдп рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рднреАрддрд░)
- рдЕрднрд┐рдХрд▓рди рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
- рдХрдВрдкреНрдпреВрдЯрд░ рддрдХ рдкрд╣реБрдВрдЪ рдЬрд┐рд╕ рдкрд░ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рд░реБрдХ-рд░реБрдХ рдХрд░ рд╣реЛрддреА рд╣реИ
рдпрд╣реА рд╣реИ, рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬреЛ рдХрдИ рдХрдВрдкреНрдпреВрдЯрд░реЛрдВ (рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ рд╡рд░реНрдХрд╕реНрдЯреЗрд╢рди рдкрд░) рдкрд░ рдЪрд▓реЗрдЧрд╛ рдФрд░ рдЕрднрд┐рдиреНрди рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдЧрд╛, рдлрд┐рд░ рдЗрд╕реЗ рдкрдврд╝реЗрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╡рд╛рдкрд╕ рдЙрд╕реА рдХреЛ рднреЗрдЬреЗрдВ рдЬрд┐рд╕рдиреЗ рдЧрд┐рдирддреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдерд╛ред
рдЪреВрдВрдХрд┐ рд╣рдореЗрдВ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЕрднрд┐рдиреНрди рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡реНрдп рд╡рд┐рдзрд┐ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо
рдореЛрдВрдЯреЗ рдХрд╛рд░реНрд▓реЛ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рджреЛ рддрд░реАрдХреЗ рд╕реНрдкрд╖реНрдЯ рд╣реИрдВ:
- рд╕реЗрдЧрдореЗрдВрдЯ рджреНрд╡рд╛рд░рд╛, рдЕрд░реНрдерд╛рдд рдкреНрд░рддреНрдпреЗрдХ рдХреИрд▓рдХреБрд▓реЗрдЯрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реЗрдЧрдореЗрдВрдЯ рдкрд░ n рдЕрдВрдХ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ
- рдЙрддреНрдкрдиреНрди рдЕрдВрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ, рдЕрд░реНрдерд╛рддреН, рдкреНрд░рддреНрдпреЗрдХ рдХреИрд▓рдХреБрд▓реЗрдЯрд░ рдкреВрд░реЗ рдПрдХреАрдХрд░рдг рдЕрдВрддрд░рд╛рд▓ рдкрд░ n / (рдХреИрд▓рдХреБрд▓реЗрдЯрд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛) рдЕрдВрдХ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ
рдореИрдВ рджреВрд╕рд░реА рд╡рд┐рдзрд┐ рдЪреБрдиреВрдВрдЧрд╛, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреБрдЫ рднреА рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛, рдореБрдЭреЗ рдЧрдгрдирд╛рдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЕрдкрдиреЗ рдЦрдВрдбреЛрдВ рдХреА рд╢реБрд░реБрдЖрдд рдФрд░ рдЕрдВрдд рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИред
рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рд╕рд░реНрд╡рд░ (рдХреИрд▓рдХреБрд▓реЗрдЯрд░) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдиреМрдХрд░реА рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдЧрд╛, рдкрд░рд┐рдгрд╛рдо рдкрдврд╝реЗрдЧрд╛ рдФрд░ рд╡рд╛рдкрд╕ рдХрд░реЗрдЧрд╛ред рдФрд░ рд╣рдореЗрдВ рдПрдХ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрд╛рддрдЪреАрдд рдХрд░реЗрдЧрд╛ред
рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдХреИрд╕реЗ рдЦреЛрдЬреЗрдВ? рд╕рднреА рдЖрдИрдкреАрдУрдВ рдХреЛ рджрд┐рд▓ рд╕реЗ рдЬрд╛рдирдирд╛ рдпрд╛ рдЙрдиреНрд╣реЗрдВ рдХрд╣реАрдВ рд▓рд┐рдЦ рджреЗрдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд╕рд░реНрд╡рд░ рдХреЗ рдЖрдИрдкреА рдкрддреЗ рдЧрддрд┐рд╢реАрд▓ рд╣реИрдВ, рд╕рд╛рде рд╣реА рд╡реЗ рдЗрд╕ рд╕рдордп рдХрд┐рд╕реА рдЕрдиреНрдп рдХрд╛рд░реНрдп рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдмрд╕ рдСрдлрд╝рд▓рд╛рдЗрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдорд╛рдзрд╛рди рд╕рд░рд▓ рд╣реИ, рд╣рдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╕рд░реНрд╡рд░реЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕рд╛рд░рдг рдЕрдиреБрд░реЛрдз рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рджреВрд╕рд░реА рд╕рдорд╕реНрдпрд╛, рд╕реВрдЪрдирд╛ рдХреЗ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХреЗ рд▓рд┐рдП рдХрд┐рд╕ рдкрд░рд┐рд╡рд╣рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ? рдПрдХ рдкреНрд░рд╕рд╛рд░рдг рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдпреВрдбреАрдкреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЗ рд▓рд┐рдП, рдЖрдк рдпреВрдбреАрдкреА рдФрд░ рдЯреАрд╕реАрдкреА рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЯреАрд╕реАрдкреА рдХреЗ рд╕рд╛рде рдХрдо рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛрдВрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдХрдиреЗрдХреНрд╢рди рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рдпрджрд┐ рджреВрд╕рд░реА рддрд░рдл рд╕реЙрдХреЗрдЯ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдУрдПрд╕ рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдЧрд╛ рдФрд░ рд╣рдореЗрдВ рдмрддрд╛рдПрдЧрд╛ред
рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХрд╛ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ: рд╕рд░реНрд╡рд░ рдЯреАрд╕реАрдкреА рд╕реЙрдХреЗрдЯ рдкрд░ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЙрд╕реА рд╕рдордп рдкреНрд░рд╕рд╛рд░рдг рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рдЕрдкрдиреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИред рдЬреИрд╕реЗ рд╣реА рдХреНрд▓рд╛рдЗрдВрдЯ рдиреЗ рдХрдиреЗрдХреНрдЯ рдХрд┐рдпрд╛ рдФрд░ рдХрд╛рд░реНрдп рджрд┐рдпрд╛, рд╣рдо рдкреНрд░рд╕рд╛рд░рдг рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрддреЗ рд╣реИрдВ, рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдЬрд╡рд╛рдм рджреЗрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рд╕реЗ рдЪрдХреНрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдХреНрд▓рд╛рдЗрдВрдЯ: рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИ, рд╕рд░реНрд╡рд░реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдмрдирд╛рддрд╛ рд╣реИ, рдЙрдирдХреЗ рдмреАрдЪ рдХрд╛рд░реНрдп рд╕рд╛рдЭрд╛ рдХрд░рддрд╛ рд╣реИ, рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
рд╕рд░реНрд╡рд░
рдкрд╣рд▓реЗ рдПрдХ рд╕рд░реНрд╡рд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЗрд╕ рдмрд╛рдд рдкрд░ рд╕рд╣рдордд рд╣реЛрдВрдЧреЗ рдХрд┐ рд╣рдо рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕ рдкреЛрд░реНрдЯ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕реЗ рдкреЛрд░реНрдЯ рдирдВрдмрд░ 38199 рд╣реЛрдиреЗ рджреЗрдВред рдлрд┐рд░ рд╣рдо рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╕рд░реНрд╡рд░ рдкрд░ рдиреМрдХрд░реА рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд░рдЪрдирд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВрдЧреЗред
#define RCVPORT 38199
#define FUNC(x) x*x // x^2
//
typedef struct {
int limits;
int numoftry;
} task_data_t;
* This source code was highlighted with Source Code Highlighter .
рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд░реНрд╡рд░ рдХреЛ рдПрдХреАрдХрд░рдг рдХреА рдКрдкрд░реА рд╕реАрдорд╛ рдФрд░ рдЙрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рднреЗрдЬ рджреЗрдЧрд╛ред
рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╣рдо рдЧрдгрдирд╛ рдХрдИ рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдХ рддрд░реНрдХ рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдХреИрд▓рдХреБрд▓реЗрдЯрд░ рдереНрд░реЗрдбреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдПрдВрдЧреЗ:
//
typedef struct {
int limits; //
long numoftry; //
long double *results; //
} thread_args_t;
//
void *calculate( void *arg) {
// thread_args_t
thread_args_t *tinfo = (thread_args_t*) arg;
long double result = 0;
int xlim = tinfo->limits;
int trys = tinfo->numoftry;
unsigned a = xlim;
for ( int i = 0; i < trys; ++i) {
int div = rand_r(&a);
int div2 = rand_r(&a);
double x = div % xlim + (div2/(div2*1.0 + div*1.0)) ;
result += FUNC(x);
}
*(tinfo->results) = result;
return NULL;
}
* This source code was highlighted with Source Code Highlighter .
рдореИрдВ рдЗрд╕ рддрдереНрдп рдкрд░ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐
рд░реИрдВрдб_рдЖрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛
рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдЗрдВрдЯ * рд╕реАрдбреИрдк) ред рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рдмреАрдЪ рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рдореВрд▓реНрдп рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╣рдо рд╕рднреА рдереНрд░реЗрдбреНрд╕ рдХреЗ рд▓рд┐рдП рд╡реИрд╢реНрд╡рд┐рдХ рд╡реИрд░рд┐рдПрдмрд▓ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣
рд░реИрдВрдб () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрдирдХреЗ рдЖрдкрд╕реА рдЕрд╡рд░реЛрдз рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛ред
рд╕рднреА рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдереНрд░реЗрдб рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЦреНрдп рдзрд╛рдЧрд╛
pthread_join () рдлрд╝рдВрдХреНрд╢рди рдкрд░
рд▓рдЯрдХрд╛рдПрдЧрд╛ рдФрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрджрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдЦрд╛рд▓реА рдЧрдгрдирд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЧрдгрдирд╛ рдХреЗ рджреМрд░рд╛рди рдорд░ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдФрд░ рдереНрд░реЗрдб рдЪрд▓рд╛рдПрдБ рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛ред
//
typedef struct {
int sock; //
pthread_t *calcthreads; //
int threadnum; //
} checker_args_t;
// SIGUSR1
void thread_cancel( int signo) {
pthread_exit(PTHREAD_CANCELED);
}
//
void *client_check( void *arg) {
// checker_args_t
checker_args_t *args = (checker_args_t*) arg;
char a[10];
recv(args->sock, &a, 10, 0); // TCP,
// , recv -1
int st;
for ( int i = 0; i < args->threadnum; ++i)
st = pthread_kill(args->calcthreads[i], SIGUSR1); // SIGUSR1
return NULL;
}
* This source code was highlighted with Source Code Highlighter .
рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдереНрд░реЗрдбреНрд╕ рдХреА рдЬрдмрд░рди рд╕рдорд╛рдкреНрддрд┐ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╕рдВрдХреЗрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рд╕реНрдореГрддрд┐ рдЙрдирдХреЗ рдХрд╛рдо рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЖрд╡рдВрдЯрд┐рдд рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИ, рдбрд░рдиреЗ рдХреА рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐
pthread_cancel () рдлрд╝рдВрдХреНрд╢рди рдФрд░
pthread_cleanup_push () рдФрд░
pthread_cleanup_pop () рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕рд╣реА рд╣реЛрдЧрд╛ред рдмреЗрд╢рдХ,
рдереНрд░реЗрдб_рдХреИрдВрд╕реЗрд▓ () рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕рд┐рдЧреНрдирд▓ рдорд┐рд▓рдиреЗ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдереНрд░реЗрдбреНрд╕ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рд╕рд┐рдЧреНрдирд▓ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдорд╛рд╕реНрдХ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЕрдиреНрдпрдерд╛ рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛрдЦрд┐рдо рд▓реЗрддреЗ рд╣реИрдВред
рдЕрдм рдПрдХ рдзрд╛рдЧрд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░рд╕рд╛рд░рдг рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдЧрд╛ред рддрд╛рдХрд┐ рдореБрдЦреНрдп рдзрд╛рдЧрд╛ рд╢рд╛рдВрддрд┐ рд╕реЗ рд▓рдЯрдХрд╛ рд░рд╣ рд╕рдХреЗ, рдЧреНрд░рд╛рд╣рдХ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд╕рдХреЗ рдФрд░ рд╣рдорд╛рд░рд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдзрд╛рдЧрд╛, рдЙрд╕ рдкрд▓ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗ рд╕рдХреЗред
void *listen_broadcast( void *arg) {
int *isbusy = arg;
// broadcast
int sockbrcast = socket(PF_INET, SOCK_DGRAM, 0);
if (sockbrcast == -1) {
perror( "Create broadcast socket failed" );
exit(EXIT_FAILURE);
}
// broadcast
int port_rcv = RCVPORT;
struct sockaddr_in addrbrcast_rcv;
bzero(&addrbrcast_rcv, sizeof (addrbrcast_rcv));
addrbrcast_rcv.sin_family = AF_INET;
addrbrcast_rcv.sin_addr.s_addr = htonl(INADDR_ANY);
addrbrcast_rcv.sin_port = htons(port_rcv);
//
if (bind(sockbrcast, ( struct sockaddr *) &addrbrcast_rcv,
sizeof (addrbrcast_rcv)) < 0) {
perror( "Bind broadcast socket failed" );
close(sockbrcast);
exit(EXIT_FAILURE);
}
int msgsize = sizeof ( char ) * 18;
char hellomesg[18];
bzero(hellomesg, msgsize);
// broadcast'
fcntl(sockbrcast, F_SETFL, O_NONBLOCK);
//
fd_set readset;
FD_ZERO(&readset);
FD_SET(sockbrcast, &readset);
//
struct timeval timeout;
timeout.tv_sec = 3;
timeout.tv_usec = 0;
struct sockaddr_in client;;
bzero(&client, sizeof (client));
socklen_t servaddrlen = sizeof ( struct sockaddr_in);
char helloanswer[18];
bzero(helloanswer, msgsize);
strcpy(helloanswer, "Hello Client" );
int sockst = 1;
while (sockst > 0) {
sockst = select (sockbrcast + 1, &readset, NULL, &readset, NULL);
if (sockst == -1) {
perror( "Broblems on broadcast socket" );
exit(EXIT_FAILURE);
}
int rdbyte = recvfrom(sockbrcast, ( void *) hellomesg, msgsize,MSG_TRUNC,
( struct sockaddr*) &client,
&servaddrlen);
if (rdbyte == msgsize && strcmp(hellomesg, "Hello Integral" ) == 0 &&
*isbusy == 0) {
if (sendto(sockbrcast, helloanswer, msgsize, 0,
( struct sockaddr*) &client, sizeof ( struct sockaddr_in)) < 0) {
perror( "Sending answer" );
close(sockbrcast);
exit(EXIT_FAILURE);
}
}
FD_ZERO(&readset);
FD_SET(sockbrcast, &readset);
}
return NULL;
}
* This source code was highlighted with Source Code Highlighter .
рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ, рдПрдХ рд╕реЙрдХреЗрдЯ рдмрдирд╛рдПрдВ рдФрд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред рдкреНрд░рд╛рдкреНрдд рдЕрдиреБрд░реЛрдз рдХреЗ рд░реВрдк рдореЗрдВ - рд╣рдо рдЗрд╕рдХрд╛ рдЬрд╡рд╛рдм рджреЗрддреЗ рд╣реИрдВред рдФрд░ рдПрдХ рдЬрдЯрд┐рд▓рддрд╛, рдЕрдиреБрд░реЛрдз рдХрд╛ рдЙрддреНрддрд░ рджреЗрдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдЗрд╕рдмрд╛рдп рдЪрд░ рдХреЗ рдореВрд▓реНрдп рд╕реЗ рддрдп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдВрдд рдореЗрдВ рдореБрдЦреНрдп рд╣реЛ рдЧрдпрд╛:
int main( int argc, char ** argv) {
// - -
if (argc > 2) {
fprintf(stderr, "Usage: %s [numofcpus]\n" , argv[0]);
exit(EXIT_FAILURE);
}
int numofthread;
if (argc == 2) {
numofthread = atoi(argv[1]);
if (numofthread < 1) {
fprintf(stderr, "Incorrect num of threads!\n" );
exit(EXIT_FAILURE);
}
fprintf(stdout, "Num of threads forced to %d\n" , numofthread);
} else {
// , -
numofthread = sysconf(_SC_NPROCESSORS_ONLN);
if (numofthread < 1) {
fprintf(stderr, "Can't detect num of processors\n"
"Continue in two threads\n" );
numofthread = 2;
}
fprintf(stdout, "Num of threads detected automatically it's %d\n\n" ,
numofthread);
}
* This source code was highlighted with Source Code Highlighter .
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреА ...
рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдореБрдЦреМрдЯрд╛ рд╕реЗрдЯ рдХрд░реЗрдВ, рдФрд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдзрд╛рдЧрд╛ рдЪрд▓рд╛рдПрдВ:
struct sigaction cancel_act;
memset(&cancel_act, 0, sizeof (cancel_act));
cancel_act.sa_handler = thread_cancel;
sigfillset(&cancel_act.sa_mask);
sigaction(SIGUSR1, &cancel_act, NULL);
// broadcast'
pthread_t broadcast_thread;
int isbusy = 1; //(int*) malloc(sizeof(int));
// broadcast
// 0 - , 1-
isbusy = 1;
if (pthread_create(&broadcast_thread, NULL, listen_broadcast, &isbusy)) {
fprintf(stderr, "Can't create broadcast listen thread" );
perror( "Detail:" );
exit(EXIT_FAILURE);
}
* This source code was highlighted with Source Code Highlighter .
рдЕрдм рд╣рдо рдПрдХ рд╕реЙрдХреЗрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЧреНрд░рд╛рд╣рдХ рдПрдХ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВрдЧреЗ:
int listener;
struct sockaddr_in addr;
listener = socket(PF_INET, SOCK_STREAM, 0);
if (listener < 0) {
perror( "Can't create listen socket" );
exit(EXIT_FAILURE);
}
addr.sin_family = AF_INET;
addr.sin_port = htons(RCVPORT);
addr.sin_addr.s_addr = INADDR_ANY;
int a = 1;
// SO_REUSEADDR
if (setsockopt(listener, SOL_SOCKET, SO_REUSEADDR, &a, sizeof (a)) < 0) {
perror( "Set listener socket options" );
exit(EXIT_FAILURE);
}
//
if (bind(listener, ( struct sockaddr*) &addr, sizeof (addr)) < 0) {
perror( "Can't bind listen socket" );
exit(EXIT_FAILURE);
}
//
if (listen(listener, 1) < 0) {
perror( "Eror listen socket" );
exit(EXIT_FAILURE);
}
* This source code was highlighted with Source Code Highlighter .
рд╣рдо рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдЪрдХреНрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:
//
int needexit = 0;
while (needexit == 0) {
fprintf(stdout, "\nWait new connection...\n\n" );
int client;
isbusy = 0; //
struct sockaddr_in addrclient;
socklen_t addrclientsize = sizeof (addrclient);
client = accept(listener, ( struct sockaddr*)&addrclient,
&addrclientsize);
if (client < 0) {
perror( "Client accepting" );
}
* This source code was highlighted with Source Code Highlighter .
рдкреНрд░рд╕рд╛рд░рдг рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рд╕реМрджреЛрдВ рдХреЗ рдмрд╛рдж рд╕реЗ рд╣рдо рдЪреБрдкрдЪрд╛рдк рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред
рдХреНрд▓рд╛рдЗрдВрдЯ рд╣рдорд╛рд░реЗ рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЙрд╕рд╕реЗ рдбреЗрдЯрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЧрдгрдирд╛ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:
isbusy = 1; //
task_data_t data;
int read_bytes = recv(client, &data, sizeof (data), 0);
if (read_bytes != sizeof (data) || data.limits < 1 || data.numoftry < 1) {
fprintf(stderr, "Invalid data from %s on port %d, reset peer\n" ,
inet_ntoa(addrclient.sin_addr), ntohs(addrclient.sin_port));
close(client);
isbusy = 0;
} else {
fprintf(stdout, "New task from %s on port %d\nlimits: %d\n"
"numoftrys: %d\n" , inet_ntoa(addrclient.sin_addr),
ntohs(addrclient.sin_port), data.limits, data.numoftry);
thread_args_t *tinfo;
pthread_t *calc_threads =
(pthread_t*) malloc( sizeof (pthread_t) * numofthread);
int threads_trys = data.numoftry % numofthread;
long double *results =
( long double *) malloc( sizeof ( long double ) * numofthread);
tinfo = (thread_args_t*) malloc( sizeof (thread_args_t) *
numofthread);
//
int numofthreadtry = data.numoftry / numofthread + 1;
for ( int i = 0; i < numofthread; ++i) {
tinfo[i].limits = data.limits;
tinfo[i].numoftry = numofthreadtry;
tinfo[i].results = &results[i];
if (pthread_create(&calc_threads[i], NULL, calculate, &tinfo[i])
!= 0) {
fprintf(stderr, "Can't create thread by num %d" , i);
perror( "Detail:" );
exit(EXIT_FAILURE);
}
}
//
checker_args_t checker_arg;
checker_arg.calcthreads = calc_threads;
checker_arg.threadnum = numofthread;
checker_arg.sock = client;
pthread_t checker_thread;
if (pthread_create(&checker_thread, NULL, client_check,
&checker_arg) != 0) {
fprintf(stderr, "Can't create checker thread" );
perror( "Detail:" );
exit(EXIT_FAILURE);
}
int iscanceled = 0; // ?
int *exitstat;
for ( int i = 0; i < numofthread; ++i) {
pthread_join(calc_threads[i], ( void *) &exitstat);
if (exitstat == PTHREAD_CANCELED)
iscanceled = 1; //
}
if (iscanceled != 1) {
long double *res = ( long double *) malloc( sizeof ( long double ));
bzero(res, sizeof ( long double ));
*res = 0.0;
for ( int i = 0; i < numofthread; ++i)
*res += results[i];
pthread_kill(checker_thread, SIGUSR1);
if (send(client, res, sizeof ( long double ), 0) < 0) {
perror( "Sending error" );
}
close(client);
free(res);
//free(checker_arg);
free(results);
free(calc_threads);
free(tinfo);
isbusy = 0;
fprintf(stdout, "Calculate and send finish!\n" );
} else {
fprintf(stderr, "Client die!\n" );
close(client);
//free(checker_arg);
free(results);
free(calc_threads);
free(tinfo);
}
}
}
return (EXIT_SUCCESS);
}
* This source code was highlighted with Source Code Highlighter .
рдмрд╛рдХреА рдХреЛрдб рд╕рд░рд▓ рд╣реИ:
- рд╣рдо рдзрд╛рдЧреЗ рдХреА рдЧрдгрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ
- рдереНрд░реЗрдб рдЪреЗрдХрд┐рдВрдЧ рд╕реНрдерд┐рддрд┐ рдЪрд▓рд╛рдПрдБ
- рд╣рдо рддрдм рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рд╕рдм рдХреБрдЫ рдирд┐рдкрдЯ рдирд╣реАрдВ рдЬрд╛рддрд╛ред
- рд╣рдо рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдЬрд╡рд╛рдм рджреЗрддреЗ рд╣реИрдВ
- рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдЪрдХреНрд░ рдирдП рд╕рд┐рд░реЗ рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛
рдореИрдВ рдЗрд╕ рддрдереНрдп рдкрд░ рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдкрдХреЛ рдЪреЗрдХрд┐рдВрдЧ рдереНрд░реЗрдб рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рддрдм рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╕рд╛рде рд╕реЙрдХреЗрдЯ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рднреА рд╕рд░реНрд╡рд░ рддреИрдпрд╛рд░ рд╣реИред
рдЧреНрд░рд╛рд╣рдХ
рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
- рд╣рдо рд╕рд░реНрд╡рд░ рдХреА рд╕реВрдЪреА рдмрдирд╛рддреЗ рд╣реИрдВ
- рдкреНрд░рддреНрдпреЗрдХ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдереНрд░реЗрдб рдмрдирд╛рддреЗ рд╣реИрдВ
- рд╣рдо рдирддреАрдЬреЛрдВ рдФрд░ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ
рдкреНрд░рддреНрдпреЗрдХ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрд▓рдЧ рдзрд╛рдЧрд╛ рдмрдирд╛рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдпрд╣ рдЖрдкрдХреЛ рдЙрдирдХреЗ рд╕рд╛рде рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
рд╕рд░реНрд╡рд░ рдХреА рддрд░рд╣, рд╣рдо рдбреЗрдЯрд╛ рд╡рд┐рдирд┐рдордп рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВрдЧреЗред рд╕рд╛рде рд╣реА рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдереНрд░реЗрдбреНрд╕ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рд╕рдВрд░рдЪрдирд╛ред
//
typedef struct {
int limits;
int numoftry;
} task_data_t;
//
typedef struct {
int limits; //
int numoftry; //
struct sockaddr_in *server; //
long double *results; //
} thread_args_t;
* This source code was highlighted with Source Code Highlighter .
рдХреНрд▓рд╛рдЗрдВрдЯ рдореЗрдВ, рдЗрд╕реЗ рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдкреЛрд░реНрдЯ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд░реНрд╡рд░ рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реИ рдХрд┐ рдкреИрдХреЗрдЯ рдХрд╣рд╛рдБ рд╕реЗ рдЖрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЪрд▓реЛ рд╡рд╣ рд▓реЗ рдЬреЛ рдУрдПрд╕ рд╣рдореЗрдВ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдЧрд╛ред рддреЛ, рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдлрд╝рдВрдХреНрд╢рди (рдереНрд░реЗрдб):
//
void *send_thread( void *arg) {
thread_args_t *task_data = (thread_args_t*) arg;
int servsock = socket(PF_INET, SOCK_STREAM, 0);
if (servsock < 0) {
perror( "Create new socket to server" );
exit(EXIT_FAILURE);
}
struct sockaddr_in listenaddr;
listenaddr.sin_family = AF_INET;
listenaddr.sin_addr.s_addr = INADDR_ANY;
listenaddr.sin_port = 0;
if (bind(servsock, ( struct sockaddr*) &listenaddr, sizeof (listenaddr)) < 0) {
perror( "Can't create listen socket" );
exit(EXIT_FAILURE);
}
socklen_t servaddrlen = sizeof ( struct sockaddr_in);
if (connect(servsock, ( struct sockaddr*)task_data->server,
servaddrlen) < 0) {
perror( "Connect to server failed!" );
exit(EXIT_FAILURE);
}
task_data_t senddata;
senddata.limits = task_data->limits;
senddata.numoftry = task_data->numoftry;
if (send(servsock, &senddata, sizeof (senddata), 0) < 0) {
perror( "Sending data to server failed" );
exit(EXIT_FAILURE);
}
int recv_byte = recv(servsock, task_data->results, sizeof ( long double ), 0);
if (recv_byte == 0) {
fprintf(stderr, "Server %s on port %d die!\nCancel calculate, on all" ,
inet_ntoa(task_data->server->sin_addr),
ntohs(task_data->server->sin_port));
exit(EXIT_FAILURE);
}
fprintf(stdout, "Server %s on port %d finish!\n" ,
inet_ntoa(task_data->server->sin_addr),
ntohs(task_data->server->sin_port));
return NULL;
}
* This source code was highlighted with Source Code Highlighter .
рдореБрдЦреНрдп, рдореБрдЦреНрдп рд╕рд░реНрд╡рд░ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд╕рд╛рде рд╣реА рдЗрд╕ рдкрд░ рдХреБрдЫ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рдЧрдИ рд╣реИ, рдореИрдВ рдЗрд╕ рдкрд░ рдЬреНрдпрд╛рджрд╛ рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред
int main( int argc, char ** argv) {
if (argc < 3) {
fprintf(stderr, "Usage: %s limits numoftry [maxserv]\n" , argv[0]);
exit(EXIT_FAILURE);
}
int numoftry = atoi(argv[2]);
if (numoftry == 0) {
fprintf(stderr, "Num of try is invalid\n" );
exit(EXIT_FAILURE);
}
int maxservu = 1000000;
if (argc == 4) {
maxservu = atoi(argv[3]);
if (maxservu < 1) {
fprintf(stderr, "Error number of max servers\n" );
exit(EXIT_FAILURE);
}
}
int limits = atoi(argv[1]);
if (limits == 0) {
fprintf(stderr, "Limits is invalid\n" );
exit(EXIT_FAILURE);
}
// broadcast
int sockbrcast = socket(PF_INET, SOCK_DGRAM, 0);
if (sockbrcast == -1) {
perror( "Create broadcast socket failed" );
exit(EXIT_FAILURE);
}
// broadcast
int port_rcv = 0;
struct sockaddr_in addrbrcast_rcv;
bzero(&addrbrcast_rcv, sizeof (addrbrcast_rcv));
addrbrcast_rcv.sin_family = AF_INET;
addrbrcast_rcv.sin_addr.s_addr = htonl(INADDR_ANY);
addrbrcast_rcv.sin_port = 0; //htons(port_rcv);
//
if (bind(sockbrcast, ( struct sockaddr *) &addrbrcast_rcv,
sizeof (addrbrcast_rcv)) < 0) {
perror( "Bind broadcast socket failed" );
close(sockbrcast);
exit(EXIT_FAILURE);
}
// broadcast
int port_snd = 38199;
struct sockaddr_in addrbrcast_snd;
bzero(&addrbrcast_snd, sizeof (addrbrcast_snd));
addrbrcast_snd.sin_family = AF_INET;
addrbrcast_snd.sin_port = htons(port_snd);
addrbrcast_snd.sin_addr.s_addr = htonl(0xffffffff);
// broadcast
int access = 1;
if (setsockopt(sockbrcast, SOL_SOCKET, SO_BROADCAST,
( const void *) &access, sizeof (access)) < 0) {
perror( "Can't accept broadcast option at socket to send" );
close(sockbrcast);
exit(EXIT_FAILURE);
}
int msgsize = sizeof ( char ) * 18;
void *hellomesg = malloc(msgsize);
bzero(hellomesg, msgsize);
strcpy(hellomesg, "Hello Integral" );
// broadcast
if (sendto(sockbrcast, hellomesg, msgsize, 0,
( struct sockaddr*) &addrbrcast_snd, sizeof (addrbrcast_snd)) < 0) {
perror( "Sending broadcast" );
close(sockbrcast);
exit(EXIT_FAILURE);
}
// broadcast'
fcntl(sockbrcast, F_SETFL, O_NONBLOCK);
//
fd_set readset;
FD_ZERO(&readset);
FD_SET(sockbrcast, &readset);
//
struct timeval timeout;
timeout.tv_sec = 3;
timeout.tv_usec = 0;
struct sockaddr_in *servers =
( struct sockaddr_in*) malloc( sizeof ( struct sockaddr_in));
bzero(servers, sizeof ( struct sockaddr_in));
int servcount = 0;
int maxserv = 1;
socklen_t servaddrlen = sizeof ( struct sockaddr_in);
// servers
while ( select (sockbrcast + 1, &readset, NULL, &readset, &timeout) > 0) {
int rdbyte = recvfrom(sockbrcast, ( void *) hellomesg, msgsize,MSG_TRUNC,
( struct sockaddr*) &servers[servcount],
&servaddrlen);
if (rdbyte == msgsize && strcmp(hellomesg, "Hello Client" ) == 0) {
servcount++;
if (servcount >= maxserv) {
servers = realloc(servers,
sizeof ( struct sockaddr_in) * (maxserv + 1));
if (servers == NULL) {
perror( "Realloc failed" );
close(sockbrcast);
exit(EXIT_FAILURE);
}
bzero(&servers[servcount], servaddrlen);
maxserv++;
}
FD_ZERO(&readset);
FD_SET(sockbrcast, &readset);
}
}
int i;
if (servcount < 1) {
fprintf(stderr, "No servers found!\n" );
exit(EXIT_FAILURE);
}
if (argc > 3 && maxservu <= servcount)
servcount = maxservu;
for (i = 0; i < servcount; ++i) {
printf( "Server answer from %s on port %d\n" ,
inet_ntoa(servers[i].sin_addr), ntohs(servers[i].sin_port));
}
printf( "\n" );
free(hellomesg);
long double *results =
( long double *) malloc( sizeof ( long double ) * servcount);
//
pthread_t *tid = (pthread_t*) malloc( sizeof (pthread_t) * servcount);
for (i = 0; i < servcount; ++i) {
thread_args_t *args = (thread_args_t*) malloc ( sizeof (thread_args_t));
args->limits = limits;
args->numoftry = numoftry / servcount + 1;
args->results = &results[i];
args->server = &servers[i];
if (pthread_create(&tid[i], NULL, send_thread, args) != 0) {
perror( "Create send thread failed" );
exit(EXIT_FAILURE);
}
}
long double res = 0;
//
for (i = 0; i < servcount; ++i)
pthread_join(tid[i], NULL);
//
for (i = 0; i < servcount; ++i)
res += results[i];
res /= numoftry;
res *= limits;
free(servers);
printf( "\nResult: %Lf\n" , res);
return (EXIT_SUCCESS);
}
* This source code was highlighted with Source Code Highlighter .
рдкреНрд░рджрд░реНрд╢рди рдкрд░реАрдХреНрд╖рдг
рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рджрд░реНрд╢рди
рдореИрдВрдиреЗ рдПрдХ рд╣реА рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░, рдПрдХ рд╣реА рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде, рд╡рд┐рднрд┐рдиреНрди рдереНрд░реЗрдбреНрд╕ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рдпрд╛ред
рд╣рдо рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдорд╛рдкрджрдВрдбреЛрдВ 2 1000000000 рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ; 1, 2, 4, 8 рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рд╡рд╛рд▓рд╛ рд╕рд░реНрд╡рд░ред
рдкрд░рд┐рдгрд╛рдо, рдХреНрд░рдорд╢рдГ: 0m37.063s, 0m20.576s, 0m20.329s, 0m21.029sред рдпрд╣ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЬреЛ рдкрд░рд┐рдгрд╛рдо рд╕рдордп рдиреЗ рджрд┐рдЦрд╛рдпрд╛, рдЙрд╕рд╕реЗ рдЖрдкрдХреЛ 4 рд╕реЗрдХрдВрдб рдШрдЯрд╛рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рд╣рдо рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред
рдПрдХ
рдХреЛрд░ (рдЯреАрдПрдо) 2 рдбреБрдУ рд╕реАрдкреАрдпреВ T5470 рдкрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ред рдЬреИрд╕рд╛ рдХрд┐ рдЕрдкреЗрдХреНрд╖рд┐рдд рдерд╛, рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рджреЛ рдХреЛрд░ рд╣реИрдВ, рдФрд░ рддрджрдиреБрд╕рд╛рд░ 2 рд╕реЗ рдЕрдзрд┐рдХ рдереНрд░реЗрдб рд▓реЙрдиреНрдЪ рдХрд░рдирд╛ рд╡реНрдпрд░реНрде рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП: рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рджреЛрдЧреБрдирд╛ рдХрд░рдирд╛
рджреЛрд╣рд░рд╛ рддреНрд╡рд░рдгред
рд╣рдордиреЗ
Asus 1215p рдкрд░ рднреА рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛, рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рдЙрдкрд░реЛрдХреНрдд рдзрд╛рдЧреЗ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рд╕рдорд╛рди рдирд┐рд░реНрднрд░рддрд╛ рд╣реИ
рдХрд╛рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рджрд░реНрд╢рди
рдЕрдм рдореИрдВрдиреЗ 1, 2, 4, 8, 16 рдХрдВрдкреНрдпреВрдЯрд░реЛрдВ рдкрд░ рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд┐рдпрд╛, рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдпрд╛рдиреА рджреЛ рдереНрд░реЗрдбреНрд╕ред
рдпрд╣рд╛рдБ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ: 0m10.268s, 0m5.122s, 0m2.487s, 0m1.265, 0m0.766sред
рдлрд┐рд░ рд╕реЗ рд╣рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдирдП рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рд╕рд╛рде, рдЧрдгрдирд╛ 2 рдмрд╛рд░ рддреЗрдЬ рд╣реЛ рдЬрд╛рдПрдЧреАред
рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░
рдирддреАрдЬрддрди, рд╣рдореЗрдВ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╕рд╛рде рдЕрднрд┐рдиреНрди рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░реЗрд╢рд╛рдирд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рд░реЛрдзреА рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдСрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд▓реЗрдЦ рдХреЗ рдмрдбрд╝реЗ рдЖрдХрд╛рд░ рдХреЗ рдХрд╛рд░рдг, рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╕рдм рдХреБрдЫ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛ред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореЗрд░рд╛ рдЙрджрд╛рд╣рд░рдг рдирдП рд▓реЛрдЧреЛрдВ рдХреЛ рдореЗрд░реЗ рд╕рд╛рде рд╣реБрдИ рдХреБрдЫ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред рдореЗрдХ рдлрд╛рдЗрд▓реНрд╕ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд╕реНрд░реЛрдд
рдпрд╣рд╛рдВ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ
рд╣реИрдВ ред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!