Difference between revisions of "love.thread (한국어)"

(Created page with "{{newin|0.7.0|070|type=module}} 멀티 스레딩을 제공하는 모듈입니다. 스레드는 메인 코드로부터 Lua 환경을 분리해 병렬적으로 실행됩니다...")
 
m
 
(7 intermediate revisions by the same user not shown)
Line 2: Line 2:
 
멀티 스레딩을 제공하는 모듈입니다.
 
멀티 스레딩을 제공하는 모듈입니다.
  
스레드는 메인 코드로부터 Lua 환경을 분리해 병렬적으로 실행됩니다. 메인 코드의 프레임 레이트를 감소시키는 일 없이 복잡한 연산을 수행할 수 있습니다. 그러나 분리된 환경은 메인 스레드의 변수나 함수에 접근할 수 없고, 스레드 간 통신은 제한되어 있습니다.
+
스레드는 메인 코드로부터 Lua 환경을 분리해 병렬적으로 실행됩니다. 이로서 메인 코드의 프레임 레이트를 감소시키는 일 없이 복잡한 연산을 효과적으로 수행할 수 있습니다. 그러나 분리된 환경은 메인 스레드의 변수나 함수에 접근할 수 없고, 스레드 간 통신 또한 자유롭지 못하기 때문에 각별한 주의가 필요합니다.
  
모든 LOVE의 객체(또는 유저데이터)공유되기 때문에 이들을 다른 스레드에서 사용하려면 객체 내용을 통째로 복사할 필요가 없이 오직 참조만 전달하면 됩니다. 물론 동시에 여러 스레드에서 같은 객체에 접근할 경우 동기화 관련 문제가 발생할 수 있습니다.
+
LOVE에서 제공하는 객체(또는 유저데이터)들은 모든 스레드에서 공유되기 때문에 이들을 다른 스레드에서 사용하려면 객체 내용을 통째로 복사할 필요가 없이 오직 참조만 전달하면 됩니다. 물론 동시에 여러 스레드에서 같은 객체에 접근할 경우 동기화 관련 문제가 발생할 수 있습니다.
  
[[Thread (한국어)|스레드]]는 시작될 때 오직 love.thread 모듈만을 로드합니다. 다른 모든 모듈은 [[require]]선언을 통해 명시적으로 불러서 사용해야 합니다.
+
[[Thread (한국어)|스레드]]는 시작되면서 love.thread 모듈만을 로드합니다. 다른 모든 모듈은 require선언을 통해 명시적으로 불러서 사용해야 합니다.
{{notice|[[love.graphics]]와 [[love.window]]몇몇 제한이 있으니 되도록이면 메인 스레드에서 사용하세요.}}
+
 
 +
{{notice|생성한 스레드에서는 [[love.graphics (한국어)|love.graphics]]와 [[love.window (한국어)|love.window]]몇몇 기능이 제한되어 있으니 이런 모듈들은 되도록이면 메인 스레드에서 사용하시길 바랍니다.}}
 
== 타입 ==
 
== 타입 ==
 
{{#ask: [[Category:Types]] [[parent::love.thread (한국어)]] [[Concept:Current]]
 
{{#ask: [[Category:Types]] [[parent::love.thread (한국어)]] [[Concept:Current]]
Line 32: Line 33:
 
[[Category:Modules]]
 
[[Category:Modules]]
 
{{#set:Description=멀티 스레딩을 제공하는 모듈입니다.}}
 
{{#set:Description=멀티 스레딩을 제공하는 모듈입니다.}}
{{#set:Since=070}}
+
{{#set:Since=000}}
== 예제 ==
 
{{oldin|[[0.9.0]]|090|type=example}}
 
=== http://love2d.org/forums/viewtopic.php?f=5&t=9934&p=60592&hilit=thread#p60592 에서 가져옴 ===
 
=== main.lua ===
 
<source lang="lua">
 
-- 스레드 만들기
 
thread = love.thread.newThread('thread','thread.lua')
 
thread:start()
 
 
 
function love.update(dt)
 
  msg_table      = msg_table or {}
 
  -- 스레드로부터 "done" 메시지를 받았을 때 실행
 
  if thread:get('done') then
 
  msg_table[1]  = thread:get('number')
 
  msg_table[2]  = thread:get('string')
 
  msg_table[3]  = tostring(thread:get('condition'))
 
  -- 각 메시지마다 \n을 추가해 긴 문자열을 만듭니다.
 
  message        = table.concat(msg_table,'\n')
 
  -- get image data from the other thread
 
  imageData      = imageData or thread:get('image')
 
 
 
  -- 이미지 초기화
 
  image  = love.graphics.newImage(imageData)
 
  end
 
  if thread:get('hasCounter') then
 
  msg_table[4]  = thread:get('counter')
 
  message        = table.concat(msg_table,'\n')
 
  end
 
end
 
 
 
function love.draw()
 
  if image then
 
  love.graphics.draw(image,50,50)
 
  end
 
  if message then
 
  love.graphics.print(message,10,10)
 
  end
 
end
 
</source>
 
=== thread.lua ===
 
<source lang="lua">
 
-- 새 스레드를 위한 모듈 로드
 
require 'love.filesystem'
 
require 'love.image'
 
require 'love.timer'
 
 
 
-- 스레드의 ID 얻기
 
thisThread  = love.thread.getThread()
 
-- 이미지 파일 로드
 
file      = love.image.newImageData('love.png')
 
 
 
-- 자신의 메시지함에 메시지 넣기
 
thisThread:set('image',file)
 
thisThread:set('number',1337)
 
thisThread:set('string','a string message')
 
thisThread:set('condition',true)
 
thisThread:set('done',true)
 
 
 
time0 = love.timer.getTime()
 
counter = 0
 
 
 
-- 1초에 한 번씩 메시지함에 카운트 수를 전송합니다.
 
while true do
 
  timeD = love.timer.getTime() - time0
 
  if timeD > 1 then
 
  counter = counter + 1
 
  thisThread:set('counter',counter)
 
  thisThread:set('hasCounter',true)
 
  time0 = love.timer.getTime()
 
  end
 
end
 
</source>
 
  
 
== 같이 보기 ==
 
== 같이 보기 ==

Latest revision as of 06:49, 28 January 2014

Available since LÖVE 0.7.0
This module is not supported in earlier versions.

멀티 스레딩을 제공하는 모듈입니다.

스레드는 메인 코드로부터 Lua 환경을 분리해 병렬적으로 실행됩니다. 이로서 메인 코드의 프레임 레이트를 감소시키는 일 없이 복잡한 연산을 효과적으로 수행할 수 있습니다. 그러나 분리된 환경은 메인 스레드의 변수나 함수에 접근할 수 없고, 각 스레드 간 통신 또한 자유롭지 못하기 때문에 각별한 주의가 필요합니다.

LOVE에서 제공하는 객체(또는 유저데이터)들은 모든 스레드에서 공유되기 때문에 이들을 다른 스레드에서 사용하려면 객체 내용을 통째로 복사할 필요가 없이 오직 참조만 전달하면 됩니다. 물론 동시에 여러 스레드에서 같은 객체에 접근할 경우 동기화 관련 문제가 발생할 수 있습니다.

스레드는 시작되면서 love.thread 모듈만을 로드합니다. 다른 모든 모듈은 require선언을 통해 명시적으로 불러서 사용해야 합니다.

O.png 생성한 스레드에서는 love.graphicslove.window의 몇몇 기능이 제한되어 있으니 이런 모듈들은 되도록이면 메인 스레드에서 사용하시길 바랍니다.  


타입

Channel (한국어) 서로 다른 스레드 사이에 데이터를 주고받는 데 사용되는 객체입니다. Added since 0.9.0
Thread (한국어) 스레드를 표현하는 타입입니다. Added since 0.7.0

함수

love.thread.getChannel (한국어) 이름 있는 스레드 채널을 생성하거나 얻어옵니다. Added since 0.9.0
love.thread.newChannel (한국어) 이름 없는 스레드 채널을 생성합니다. Added since 0.9.0
love.thread.newThread (한국어) 루아 파일이나 FileData로부터 새로운 스레드를 생성합니다. Added since 0.7.0


같이 보기

다른 언어