임베디드

[Thread] 멀티스레드 인자 값 넘기기

히똔 2022. 4. 21. 16:27
728x90
반응형

thread 에 인자값을 넘길 수 있다.
create시 변수의 주소를 넘기는 방식을 이용한다.
구조체 변수를 이용하면 더 많은 값을 넘길 수 있다.

 

멀티스레드 인자값 넘길 때 문제점


예를 들어 다음과 같은 코드를 실행하면 어떤 값이 나올 것 같은지 예상해보자.

thread 인자 넘기기

0~3로 변하는 i 값이 printf 되고, 스레드는 순차적으로 진행되지 않다는 특징을 알고있다면

0 1 2 3
3 2 1 0
3 1 0 2

뭐 이런식이겠지 싶을것이다.

그런데 실제로는 이렇게 나오지 않는다.듣도 보도 못한 4가 나온다.. 잘 보면 숫자가 중복돼서 나올 때도 있다.

 

스레드 동작이 이상한 이유

왜그럴까..? 힌트는 main 함수도 스레드라는 것이다.

원인은 스레드를 생성하는 것보다 main 함수가 반복문을 도는 것이 더 빠르기 때문이다.
main 함수가 너무 빠르게 반복문을 돌다보니 첫번째 스레드에서 printf 할 시 main 함수는 이미 i가 2로 설정되어있을 수 있는 것이다. 그렇기 때문에 4가 나올 수 있는 것이다.

 

해결방법 : 배열만들기

그럴때는 배열에 i값을 저장해서 배열을 인자로 넘겨주면 해결된다.

배열값 참조

예상대로 나온 결과

728x90
반응형