비동기 데이터 전달 라이브러리 설계

dcmru의 이미지

안녕하세요.

라이브러리를 하나 만들고 있습니다.

라이브러리에 저장된 데이터를 어떻게 식별하고 리턴할지 의문이 들어서 질문을 드려봅니다.

방식은 의사코드로 설명을 드리면 Init()->반복적 DoFunc()->GetResult()->Free()의 순으로 실행을 하되,

라이브러리를 call하는 프로그램은 여러 스레드에서 각각 따로 실행을 하여 각각 결과를 리턴 받으려고 합니다.

쉽게 드는 생각은 함수를 실행할 때 식별자 전달하여 라이브러리에서 관리를 하면 어떨까하는데요.

어떤 방법론으로 접근을 해야 하는지 도움말 또는 키워드를 부탁 드립니다.

감사합니다.

kukyakya의 이미지

각각의 쓰레드가 호출한 결과를 쓰레드가 각자 받아야 한다면 왜 비동기식으로 만드시나요?

라이브러리를 어떤 쓰레드가 실행하게 되는지 등등의 설명이나 예제 코드 없이는 답변하기 힘들 것 같습니다.

dcmru의 이미지

제목을 비동기식으로 명명하여서 혼선이 있는 것 같습니다.
제가 원하는 형태의 구조는 라이브러리를 호출하는 각각 스레드에서 위의 함수 사이클을 실행하게 되었을 때
라이브러리 내의 함수는 같은 함수들을 사용하기 때문에 라이브러리를 호출하는 각 스레드에서 전달하는 데이터와 결과는 라이브러리 내에서 구분이 되어야 합니다.
이런 구조로 설계를 생각을 했습니다만 이와 같은 유사한 구조 또는 다른 방법이 있는지 문의를 드리는 것입니다.

노력만이 살길이다.

mirheekl의 이미지

API들이 사실 상당수가 이런 식이죠. 소켓만 봐도 그렇지 않습니까? 식별자별로 내부 오브젝트가 관리되고 사용 종료 명령이 떨어지면 해당 식별자와 관련된 오브젝트를 폐기하는..

thread safe만 잘 감안하고 설계하시면 별 문제 없을 것 같네요

--

dcmru의 이미지

답변 감사드립니다.
라이브러리를 thread safety와 reenterence를 감안한다고 하였을 때 라이브러리 내부에서 각 데이터를 구분하는 방법은 무엇이 있을까요?
식별자를 구분하는데 어떤방법으로 사용할지 그리고 식별자와 데이터의 관리는 어떤 자료구조를 이용할지 조언 부탁 드립니다.
혹은 참고할만한 이와 같은 구조의 오픈소스의 라이브러리가 있다면 소개 부탁 드립니다.

노력만이 살길이다.

mirheekl의 이미지

자료구조는 어차피 레퍼런스만 남으면 되니까 어떤 것을 사용하든 크게 중요치 않다 생각합니다. 프로젝트 특성에 맞는 것을 고르면 되고 그냥 일반 구조체를 사용하더라도 손색이 없습니다. 물론 구조체 말고도 클래스 인스턴스라든지 데이터베이스 키 등등 뭐가 됐든 상관이 없습니다. 클라이언트에게 넘겨주는 ID나 주소 값 한개만으로 해당 오브젝트를 찾아갈 수 있기만 하면 됩니다.

간단한 예를 찾아봤는데 https://github.com/ynezz/librs232/tree/master/src 이게 도움이 될 것 같네요. 시리얼 통신 라이브러리인데, rs232_windows를 보시면 딱 전형적인 형태를 가지고 있습니다. rs232_init 펑션이 내부 오브젝트 생성 및 초기화를 한 뒤 포인터값을 리턴하고, 다른 i/o펑션들은 그 오브젝트 포인터를 항상 취하며(ID역할), rs232_end 펑션은 해당 ID를 해제하고 관련 오브젝트를 반납하고 있네요. 이게 딱 전형적인 형태입니다. 단, 이 예제의 경우 스레드간 공유되는 자원을 사용하지 않기 때문에 multithread safe 관련된 내용은 구현이 돼있지 않은 듯 합니다 (또는 하부 소스코드에 숨겨져 있는지도 모릅니다).

--

dcmru의 이미지

말씀하신대로 IO 함수마다 구조체를 넘기도록 되어 있군요.
제가 만드려는 라이브러리 구조에 응용할 수 있을 것 같습니다.
좋은 예제 감사드립니다.

노력만이 살길이다.

댓글 달기

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