boost unordered map insert 와 find

plrmsu의 이미지

안녕하세요

boost unordered map을 사용중 문의가 있어 이렇게 글을 쓰게 되었습니다.

멀티 쓰레드 환경에서 공유 자원으로 unoredered map 사용하고 있습니다.

delete는 사용하지 않고 find 와 insert만 사용하고 있는데

성능상 이슈로 lock을 걸지 않고 사용하고 있습니다.

lock을 걸지 않을 경우 find도중 insert를 하게 되면 iterator가 꼬여

find에서 error 발생할 수 있다는 생각을 했는데,

거꾸로 insert에서 core를 떨구면 프로세스가 죽는 현상이 생기고 있습니다.

segment fault에 대한 signal 핸들링은 하지 않고 있습니다.

혹시 이런경험 있으신가여?

jick의 이미지

동시에 여러 개의 쓰레드가 접근할 수 있는 container를 락을 안 걸고 쓰는 건 그냥 잘못된 코드입니다. 어디서 언제 어떻게 죽어도 이상하지 않습니다. (여기서 "어디서"는 find, insert 정도가 아니라, 메모리가 깨지면 문자 그대로 프로그램 아무 데서나 다 죽을 수 있다는 말입니다. 확률적으로 그 container를 쓰는 곳에서 죽을 확률이 높을 뿐이죠.)

plrmsu의 이미지

답변 감사 합니다. 원칙은 lock을 무조건 걸어야 되는데, 제가 일하는 분야에서는 성능에 워낙 민감해서
lock를 사용하지 않는 경우도 종종 있어문의를 드렸는데, 제 질문이 잘못 된것 같습니다.
좋은하루 보내세여^^

jick의 이미지

성능 때문에 lock을 안 걸어도 되는 경우는 매우 제한적입니다. 예를 들어 이벤트의 갯수를 세는 변수가 있어서

int event_count;
 
......
event_count++; /* no lock! */

이런 경우라면 락을 걸지 않아서 생길 수 있는 최악의 경우라고 해봤자 변수의 값이 잘못 들어가는 것이니 이 변수값을 "대략의 카운트"로 생각하고 가끔씩 엉뚱한 값이 나와도 괜찮다고 한다면 이렇게 쓸 수 있습니다.

하지만 이건 특수한 경우고, 일반적으로 "동시에 여러 쓰레드가 접근하는 상황"을 간주하지 않은 코드에서 동시에 여러 쓰레드가 접근하면 그냥 무조건 버그라고 생각하시는 편이 좋습니다. 특히 요즘은 컴파일러와 CPU가 쓸데없이(?) 좋아져서, 코드에서 변수 a와 b를 순서대로 사용해도 컴파일러가 순서를 바꿔 놓을 수 있고, 컴파일러가 안 그래도 CPU가 자기 맘대로 순서를 바꿔서 실행할 수 있습니다.

kukyakya의 이미지

성능에 민감한 경우라면 shared_mutex나 upgrade_mutex를 사용하시는걸 추천드립니다.

plrmsu의 이미지

감사합니다.^^ 수고하세요

plrmsu의 이미지

감사합니다.^^ 수고하세요

댓글 달기

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