string 조작시, lock을 걸어줘야 하나요?

hohory의 이미지

안녕하세요.

stl의 string을 자주 사용하고 있습니다.

string으로 선언된 변수1이 있는데,

이 변수1 을 두개의 thread에서 접근합니다.

그리고 한 thread에서는 이 변수1을 수정합니다. (다른 thread에서는 읽어만 감)

이럴때, 각 thread가 변수1에 access할때, lock을 걸어주는것이 맞는지요?

string도 결국 내부적으로는 character array를 dynamic하게 만들어서 사용하는 것일 테이고,

string 값을 조작(업데이트)하게 되면, 이 array가 줄었다, 늘어났다 할 것이므로,

이런 string 값에 multi thread들이 access할 때 lock을 걸어주지 않으면,

한 thread에서 변수1을 read하고 있는 와중에,

다른 thread가 변수1의 값을 수정해서,

character array 의 사이즈가 줄어들어 버리면,

read하던 thread는 비정상적인 값을 읽어버리지 않을까요?

만약 OS가 thread 제어권을 제어할때,
application이 sleep 상태에 들어가기 전에는,
절대 제어권을 뺏지 않는다면,
string변수를 읽을때 중간에 sleep을 할리는 없으므로,
따라서 제어권을 뺏기지 않아, 하나의 access 작업이 끝날때까지는,
안전할 터이니 lock을 걸 필요가 없을거 같은데요.

고수님들의 의견 부탁드릴께요.

kyagrd의 이미지

공유 데이타에 접근할 때는 락을 걸어야 하는 것이 기본이고,

non-preemptive 스케줄링을 하면야 당연히 락이 필요 없죠.

--
There's nothing so practical as a good theory.
- Kurt Lewin

--
There's nothing so practical as a good theory. - Kurt Lewin
"하스켈로 배우는 프로그래밍" http://pl.pusan.ac.kr/~haskell/

익명사용자의 이미지

stl은 thead에 대해서 lock을 전혀 상관하지 않습니다.
개발자의 몫입니다.
따라서 동일 객체에 여러 쓰레드가 엑세스할 경우에 꼭 락을 걸어주세요.
(기타 비슷한 거라도..)
혹시 단일 CPU 장비에서 돌릴때는 에러가 안날지 몰라도,
멀티 CPU에서 돌리면 문제가 생기는 경우가 있으니 꼭 테스트 하시구요.

dormael의 이미지

락을 쓰는게 확실하긴 할겁니다.

c++, stl로 개발하지는 않지만 멀티 쓰레드를 많이 하긴 해서 생각해 보건데..

락을 꼭 피하고자 한다면 get, set을 만들어 주고 set 에서는 임시 char*를 만들어 작업후에 마지막으로 참조만 바꾸어 주는 방법을 쓸 수도 있습니다.

아니면 아예 wrapper를 이용해 string의 참조를 get, set 하는 방법도 있을테구요.

이미 다른 쓰레드에서 get 해간 string의 참조는 무시할 수 있다고 생각될 때의 상황입니다.

선택은 string의 변화를 감지해야 하는 범위와 시스템에서 요구하는 정확도에 따라 다를 수 있다고 생각합니다.

-- Signature --
青い空大好き。
蒼井ソラもっと好き。
파란 하늘 너무 좋아.
아오이 소라 더좋아.

kalstein의 이미지

get, set 을 쓴다고 해서...Thread Safe 를 보장하진않습니다만...

lock을 걸지않고서는 단순한 대입 과정도 멀티스레드 환경하에서는 어떻게 동작할지 모릅니다.


------------------------------------------
Let`s Smart Move!!
http://kalstein.tistory.com/

dormael의 이미지

제가 c++에는 문외한이라. ^^

주소(참조, 포인터)할당이나 기본형의 값 할당에도 Thread Safety가 보장되지 않는가 보네요.

그래도, 다른 쓰레드에서 한번 get을 통해 가지고 있는 참조를 읽거나 하는데는 논리적으로 문제는 없지 않을까요?
물론 이 참조가 서로 다른 메모리의 영역에 있고 코드상에서 한번 가져온 참조를 계속 이용하는걸 전제로 했을때의 이야기 입니다.
대체적으로 이런식으로 코드를 많이 작성했었거든요. c++은 아니고 java였습니다..

-- Signature --
青い空大好き。
蒼井ソラもっと好き。
파란 하늘 너무 좋아.
아오이 소라 더좋아.

ㅡ,.ㅡ;;의 이미지

C/C++에서 기본적으로 보장되진않죠.. 안되야하구요..
사용자의 선택에 맏겨야죠.. 무조건된다는건 그만큼 사용자가 더하위레벨에 접근하지 못한다는뜻이구요..

읽기만하는데는 생각하신데로 문제 없습니다. 주로 생각한데로 되죠..


----------------------------------------------------------------------------

나빌레라의 이미지

전형적인 생산자 소비자 문제 입니다.

변수1 을 수정하는 쓰레드가 생산자이고, 변수2 를 수정하는 쓰레드가 소비자 이지요.

OS 공부할때, 동기화 부분에서 나오는 락을 걸어야할 가장 전형적인 상황입니다.

hohory 님 의견대로 OS 가 non-preemtion 이라면 lock 을 걸 필요가 없긴 합니다만, 리눅스는 사용자 영역에서 preemtion 스케줄링을 합니다.

그러니 당연히 lock 을 걸어야 겠지요.

얇은 사 하이얀 고깔은 고이 접어서 나빌레라

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.