2009-11-20 6 views
0

3 개의 스레드를 실행하여 파일에 문자열을 추가해야합니다. (ii) 다른 스레드가 작성된 스트림에서 특수 문자를 제거해야합니다. (iii) 세 번째 스레드는 단어를 오름차순으로 정렬 할 수 있습니다. 어떻게하면 스레드 안전 (동기화) 방식으로 처리 할 수 ​​있습니까?초보자를위한 도움말 -

나는

스레드 1

sample.txt 

Apple 
Ma#22ngo 
[email protected]&&pes 

스레드 2 (특수 문자를 제거한 후의 Sample.txt)

Apple 
Mango 
Grapes 

스레드 3 (의 Sample.txt)

Apple 
Grapes 
Mango 
을 의미
+5

왜 스레드가 필요합니까? 이것은 하나의 스레드가 모든 것을 처리 할 수있는 것처럼 보입니다 ... 3 개의 스레드가 있다면 그들은 모두 서로를 기다릴 필요가 있습니다 ... – Zenuka

+1

야,이 스레드를 시작하는 나쁜 예입니다. 각 스레드는 잠겨 있으며 다른 스레드는 파일과 함께 작동합니다. –

답변

5

왜 여러 스레드를 사용하여이 작업을 수행하려고합니까? 아마도 당신의 예제가 지나치게 단순화되었지만 스레딩을 피할 수 있다면 그렇게하십시오 - 그러면이 문제는 필요하지 않은 것으로 보입니다.

파일이 많습니까, 아니면 실제로 크기가 큰 파일이 있습니까? 왜 세 가지 행동을 하나씩 순차적으로 수행 할 수 없습니까?

UPDATE

가 나는 적어도 시도하고 당신이 직면하고있는 근본적인 문제를 해결하는 데 도움이해야 느꼈다. 당신이 바라는 일을 파이프 라인으로 생각할 필요가 있다고 생각합니다. 문자열로 시작하고, 특수 문자를 제거 (정리)하고, 파일에 쓸 수 있습니다. 마침내 모든 문자열을 작성하면 정렬해야합니다.

정렬 단계까지 모두 단일 스레드로 수행 할 수 있으며,해야합니다. 문자열을 읽고, 지우고, 파일에 쓰고, 다음 문자열로 이동합니다. 모든 문자열이 파일에 깔끔하게 기록 될 때까지는 정렬의 최종 작업을 쉽게 수행 할 수 없습니다.

쓰기 및 정렬 할 파일이 많은 경우 각각의 파일은 별도의 스레드에서 처리 할 수 ​​있지만 주어진 파일을 처리 할 때는 여러 스레드가 필요하지 않습니다.

2

파일에 쓰기 전에 특수 문자를 제거하여 동일한 스레드에서 작업 1과 2를 수행합니다. 작업 3은 파일이 쓰여지는 동안 읽지 않고 정렬 할 수 없기 때문에 다른 사람들과 병렬로 실행할 수 없습니다. 그래서 기본적으로 이러한 작업은 순차적이며 별도의 스레드에 넣는 것은 의미가 없습니다.

0

ThredSafe 대기열을 구현하거나 Parallels 확장과 함께 제공해야합니다.

스레드는 정보를 공유하는 데 문제가 있으므로 이론적으로 솔루션이 완벽한 병렬 시나리오로 여겨지더라도 실제로 스레드가 공유 데이터에 자유롭게 액세스 할 수는 없습니다. 나쁜 일이 일어난다.

대신 동기화 메커니즘 (이 경우 ConcurrentQueue)을 사용할 수 있습니다. 그렇게하면 다음을 갖게됩니다.

ConcurrentQueue<string> queueStrings; 
ConcurrentQueue<string> queueFile; 

Thread1은 문자열을 queueStrings 큐에 삽입합니다.

Thread2는 queueString에서 문자열을 읽고 처리 한 다음 queueFile 큐에 삽입합니다.

마지막으로 Thread3은 처리 된 문자열을 queueFile에서 읽고 파일에 기록합니다.

+0

당신은 C# 4.0을 의미 .. ..? –

+0

C# 3.0에서 작업 중입니다. –

+0

예, Parallels 확장 CTP 또는 C# 4.0 중 하나를 사용하거나 직접 구현할 수 있습니다 –

관련 문제