0

C で FIFO を実装しています。1 つのスレッドが FIFO に書き込み、もう 1 つのスレッドがそこから読み取っています。

#define BUFFER_LENGTH   1000
struct Frame
{
    char data[1024];
    unsigned int data_len;
    struct Frame* frame;
};

struct Frame * get_from_fifo ()
{
    if (!fifo_length)
    {
        first = last = NULL;
        return NULL;
    }
    struct Frame* frame = first;
    first = first->frame;
    fifo_length--;
    return frame;
}


int add_to_fifo (const char* data, unsigned int frame_size)
{
    if (fifo_length >= BUFFER_LENGTH)
    {
        ast_log(LOG_ERROR, "Buffer full\n");
        return SURESH_ERROR;
    }

    struct Frame* frame = malloc(sizeof (struct Frame));
    frame->data_len = frame_size;
    memcpy(frame->data, data, frame_size);

    if (last)
    {
        last->frame = frame;
        last = frame;
    }

    if (!first)
    {
        first = last = frame;
    }
    fifo_length++;
    return SURESH_SUCCESS;
}

関数 *add_to_fifo* と *get_from_fifo* が異なるスレッドによって同時に呼び出されるのを防ぐにはどうすればよいですか? つまり、*get_from_fifo* は、他のスレッドが *add_to_fifo* を実行していないときにのみ呼び出す必要があり、その逆も同様です。

4

2 に答える 2

1

FIFO スタックを実装しているため、実際に同時に行う操作はスタック サイズの変更のみfifo_lengthです ( )。
スタックの末尾にエントリを追加し、スタックの先頭からエントリを削除しているため、これら 2 つの操作が互いに干渉することはありません。したがって、心配する必要があるのはスタック サイズ ( fifo_length) の変更だけです。これをミューテックスまたはフラグ (上記の「Joey」で述べたように) によって同期される別の関数に入れ、add_to_fifo()get_from_fifo()関数の両方から呼び出します。

于 2012-09-02T20:40:47.713 に答える
0

ミューテックス (相互排除) 変数を使用する必要があります。pthread ライブラリには、必要なものがすべて含まれています。使用可能な関数を調べるには、次の場所が適しています。

http://pubs.opengroup.org/onlinepubs/009695399/basedefs/pthread.h.html

各スレッドがアクセスできるミューテックス変数を初期化する必要があります: http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_mutex_init.html

次に、スレッドは共有メモリにアクセスする必要があるときにロックする必要があり、共有メモリの使用が完了したらロックを解除する必要があります

簡単な例を次に示します: http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Frzahw%2Frzahwe18rx.htm

幸運を!

于 2012-09-02T20:23:49.183 に答える