[완료] volatile과 mutex에 대해서...

mg2000의 이미지

안녕하세요.

제가 멀티스레드 프로그래밍에 대해서 공부하다 아래와 같은 글을 봤는데요.

Quote:
* Outside a critical section, any thread might interrupt any other at any time; there is no control, so consequently variables accessible from multiple threads are volatile. This is in keeping with the original intent of volatile — that of preventing the compiler from unwittingly caching values used by multiple threads at once.
* Inside a critical section defined by a mutex, only one thread has access. Consequently, inside a critical section, the executing code has single-threaded semantics. The controlled variable is not volatile anymore — you can remove the volatile qualifier.

원문: http://www.ddj.com/cpp/184403766

크리티컬 섹션 밖에서는 volatile을 유지해야 하고, 크리티컬 섹션 안에서는 single-thread프로그램과 다를바 없으니,

volatile를 떠어버려도 된다는 이야기 같은데...

그렇다면, 제가 만든 클래스를 여러 클래스에서 공유해서 사용하도록 할 생각인데,

이 클래스를 사용할때, mutex로 Lock/Unlock만 잘 시켜준다면 제가 선언한 오브젝트를 volatile로 선언할

필요가 없는건가요?

원문 전체 내용을 보면 그게 아니것 같기도 하고... 헷갈리네요.

papyrus76의 이미지

volatile 키워드의 사용목적은 컴파일러가 생성하는 불필요해 보이는(?) 코드에 대한 최적화를 하지 않도록 하는것입니다.

예 1)
SomeStaticData = 3;
SomeStaticData = 3;

위 예처럼 저 두개의 문장은 언뜻보기에는 하나의 문장만 있어도 상관없죠.
하지만 다음 예를 봅니다.

예 2)

[ 실행컨텍스트 A - (ex : 어떤 응용프로그램 코드이고 쓰레드 A 라고 가정하죠~~) ]
SomeStaticData = 3; /* 여기서 실행컨텍스트 B로 스위칭될수 있다고 가정해요 ~ */
SomeStaticData = 3;

[ 실행컨텍스트 B - (ex : 어떤 인터럽트 핸들러 혹은 쓰레드 B 라고 가정하죠~~. 즉 실행컨텍스트 A와는 다른 컨텍스트입니다) ]
SomeStaticData = 0;

실행컨텍스트 A의 두번째 문장은 불필요해보이지만, 첫번째 문장에서 3을 대입후, 다른 컨텍스트에서 0으로 초기화가 될수 있음으로
분명 두개의 문장 모두가 필요합니다.

하지만 실행컨텍스트 A에서 뮤텍스등으로 임계영역을 설정하면 , 실행컨텍스트가 쓰레드인경우 그사이에 실행컨텍스트 B로 스위칭될가능성이 없음으로 volatile 선언은 필요없습니다.
원문의 내용은 그 얘기구요. 하지만 실행컨테스트가 인터럽트 핸들러라면, 임계영역이 설정되어도 스위칭됨으로, volatile 키워드가 필요하겠죠.

정리하면, 컴파일러는 기본적으로 코드는 동시에 하나의 컨텍스트만이 실행한다고 가정하고 최적화를 하는데,
하지만, 실제로 여러개의 컨텍스트가 동시에 변수를 공유하게 된다면, volatile 변수를 사용하거나, 다른방법을 고려해 보셔야 합니다.

얘기가 길었는데, 결론은 원문을 제대로 이해하신겁니다.
도움되셨기를...

mg2000의 이미지

많이 배우고 갑니다. ^^

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.