2012-01-09 10 views
0

私はスレッドのスケジューリングにあまり苦労しています。私は4-5スレッドのようなものを持っていて、それぞれランダムな時間に同じバッファにデータを追加します。 スレッドを同時にスケジュールすることができますので、バッファに同時にアクセスするスレッドが2つ以上ありません。 私はWindows環境でC言語でコーディングしています。1つのバッファを共有する - スレッドセーフ

ありがとうございます。

+1

あなたはboostのタグを持っているので、このCまたはC++ですか? – hmjd

+0

C、申し訳ありませんが、それは間違ったタグ.... – VisaToHell

+0

どのような種類のバッファー - どのように整理されていますか? –

答えて

1

共有バッファは、異なるスレッドによる同時読み込み/書き込みから保護する必要があります。これを防ぐには、同期オブジェクトを使用する必要があります。スレッドが共有バッファの読み書きをしようとするときはいつでも、ロックを獲得し、共有バッファ上でその操作を実行し、一度それがバッファを必要とすることなくロックを解放する。

例の同期オブジェクトは、CriticalSection次のようになります。

static CRITICAL_SECTION shared_buffer_lock; 
static char shared_buffer[10]; 

int main() 
{ 
    InitializeCriticalSection(&shared_buffer_lock); 

    /* Start threads */ 
    ... 

    /* Wait for threads */ 
    ... 

    DeleteCriticalSection(&shared_buffer_lock); 

    return 0; 
} 

/* In thread.. */ 

/* Obtain sole access to 'shared_buffer' */ 
EnterCriticalSection(&shared_buffer_lock); 

/* Use 'shared_buffer' ... */ 

/* Release sole access of 'shared_buffer' */ 
LeaveCriticalSection(&shared_buffer_lock); 
+0

ありがとう非常に有用な男:) – VisaToHell

1
pthread_mutex_t   mutex = PTHREAD_MUTEX_INITIALIZER; 
int      sharedData=0; 

void *func(void *parm) 
{ 
    int rc; 
    printf("Thread Entered\n"); 
    pthread_mutex_lock(&mutex); 

    /********** Critical Section *******************/ 
    printf("Start critical section, holding lock\n"); 
    ++sharedData; 
    printf("End critical section, release lock\n"); 

    /********** Critical Section *******************/ 
    pthread_mutex_unlock(&mutex); 


} 

上記の例では、pthreadsのライブラリを使用して、探しているものを示しています。 pthread_mutex_lockでmutexを取得し、pthread_mutex_unlockで解放してください。同じロックを要求するすべてのスレッドは、mutexが解放されるまでブロックされます。これにより、1つのスレッドのみが共有データにアクセスできることが保証されます。

0

ressource(バッファ)への排他的アクセスを実装する必要があります。 Windowsでは、Mutexesを使用します(Windows APIのCreateMutexとWaitForSingleObject/WaitForMultipleObjectsを参照)。

関連する問題