C language
Logic_Game1 Aegis Royale ~ , ~
GuTTe
2018. 8. 18. 23:53
문제닷! ???의 값을 구하라는 문제다
처음 쓰레드를 몰랐을 땐 와 저거 어떻게 풀지였는데 윈도우 쓰레드를 배우고 난뒤엔
semaphore께서 이걸 풀어 주시네... ㅎㅎ
일단 내가 짠 알고리즘은 세마포어를 이용해서 i x i 부분이 홀수일 때와 짝수일 때로 나누어서 풀었다.
참고로 이 코드는 소켓 프로그래밍 공부하다가 쓴 코드인데 직접짜기 귀찮아서 예제코드에서 수정해서 썼다. ㅎㅎ
밑엔 코드 ~,~
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #include <stdio.h> #include <windows.h> #include <process.h> unsigned WINAPI Read(void * arg); unsigned WINAPI Accu(void * arg); static HANDLE semOne; static HANDLE semTwo; static int num; static unsigned __int64 a = 1, b = 7, c = 0; int main(int argc, char *argv[]) { HANDLE hThread1, hThread2; semOne = CreateSemaphore(NULL, 0, 1, NULL); semTwo = CreateSemaphore(NULL, 1, 1, NULL); hThread1 = (HANDLE)_beginthreadex(NULL, 0, Read, NULL, 0, NULL); hThread2 = (HANDLE)_beginthreadex(NULL, 0, Accu, NULL, 0, NULL); WaitForSingleObject(hThread1, INFINITE); WaitForSingleObject(hThread2, INFINITE); CloseHandle(semOne); CloseHandle(semTwo); return 0; } unsigned WINAPI Read(void * arg) //짝수 { int i; for (i = 2; i <= 10000; i = i + 2) { WaitForSingleObject(semTwo, INFINITE); c = i * i + b + 5; printf("%d : %lld\n", i, c); ReleaseSemaphore(semOne, 1, NULL); } return 0; } unsigned WINAPI Accu(void * arg) //홀수 { int sum = 0, i; for (i = 3; i <= 10000;) { WaitForSingleObject(semOne, INFINITE); b = i * i + c + 5; printf("%d : %lld\n", i, b); i = i + 2; ReleaseSemaphore(semTwo, 1, NULL); } return 0; } | cs |