[해결했습니다!]인라인 어셈블리를 처음 접하면서 lock의 의미가 이해가 안되는데 도움을 요청합니다..
인라인 어셈블리를 접한지 7시간이 되어가는 상황입니다.
두 개 이상의 스레드를 만들어서 inc 명령어처럼 1씩 증가하여
예상하는 결과가 나오도록 lock을 사용하려는 상황입니다.
처음이라 부족하지만 '인라인 어셈블리', 'lock' 과 관련된 검색어들은 다 찾아보며
작성해봤지만 예상했던 결과 값이 나오지 않아서 절망적입니다.
뇌의 생각하는 기능도 마비가 되어버린 것 같습니다.
제 소스코드 입니다. (lock함수와 unlock함수입니다.)
#define LOCK_PREFIX "lock \n\t"
int lock = 0; // 1일 때 lock 상태라고 하겠습니다.
void lock(int *lock)
{
int new = 1;
asm volatile(
"rep: \n\t" // jz rep이 되다가 몇 번 수정을 거치니 무시되어 lock이 종료됩니다.
LOCK_PREFIX
"cmpxchgl %1,%0 \n\t"
"jz rep \n\t"
: "+m"(*lock)
: "ir"(new)
: /* no */
);
}
void unlock(int *lock)
{
asm volatile(
LOCK_PREFIX
"decl %0 \n\t"
: "+m"(*lock)
: /* no */
: /* no */
);
}
이 함수를
1. lock
2. 값증가
3. unlock
순서로 사용하고 싶은데 예상되는 값이 나오지 않아서 고민 끝에 더 이상 자료를 보고 이해할 수가 없어서
질문하게 되었습니다. 제가 부족하지만 질문에 답변해주시면 정말정말 감사드리겠습니다.
아! 해결했습니다. 감사합니다~~
lock 함수에서
1. LOCK_PREFIX : 삭제했습니다. (xchgl에 lock이 포함되어 있다고 이해했습니다.)
2. cmpxchgl : xchgl 으로 수정했습니다.
3. jz rep : cmp $1,%1; je rep; 으로 수정했습니다.
4. output에 "=ir"(new) 를 추가했습니다.
댓글 달기