-1

ソースファイル ac と bc の間でこれらのようなキューを渡しています

ファイル:ac

sq[a]=new_queue();

pthread_create(&st[a],NULL,sendPacket,sq[a]);

ファイル:bc

void *sendPacket(void *queue){

/* here i need to know which queue has come ,determine
   the index of queue how can I do it? */
}
4

4 に答える 4

1

キューのより高レベルな表現を作成します。キューはvoid *(実際のタイプを表示していない、つまり、new_queue()呼び出しが返すものは何ですか?)である可能性があるようです。追加のパラメーターを追加しながら、それを構造体に埋め込みます。

struct queue_state {
    void *queue;
    int  index;
};

次に、構造体をインスタンス化し、それへのポインターをスレッド関数に渡します。

struct queue_state qsa = malloc(sizeof *qsa);
if(qsa != NULL)
{
  qsa->queue = new_queue();
  qsa->index = 4711; /* or whatever */
  pthread_create(&st[a], NULL, sendPacket, qsa);
}

その後、スレッド関数はstruct宣言を使用してすべてのフィールドにアクセスできます。もちろん、宣言はqueue.h、両方の C ファイルからインクルードされる共有ヘッダー (たとえば ) にある必要があります。

于 2012-05-20T14:22:01.623 に答える
1

あなたの質問の説明は非常に大雑把です。しかし、少なくとも私が理解していることから、実際には 2 つのパラメーターを関数に渡す必要があります。(ポインターへの) キュー (私にとっては配列のようです) と、このキュー内のインデックスです。

type の単一の変数に両方のパラメーターをパックすることはできませんvoid*。あなたができることは、必要なすべてのパラメーターを含む構造体を宣言し、それを埋めて、それへのポインターをスレッドに渡すことです。

このように(エラー処理は省略):

struct Params
{
    queue* m_Queue;
    size_t m_Idx;
};

// ...
Params* pParams = new Params;
pParams->m_Queue = sq;
pParams->m_Idx = a;

pthread_create(&st[a],NULL,sendPacket, pParams);


void *sendPacket(void *pPtr)
{
    Params* pParams = (Params*) pPtr;

    // ...

    delete pParams;
}
于 2012-05-20T14:24:55.430 に答える
0

関数にインデックスを渡すだけの方がおそらく簡単です。

void *sendPacket(int queue_idx) {
    queue_t *queue = &sq[queue_idx];
}
于 2012-05-20T14:20:26.910 に答える
0

bcで にアクセスできる場合はsq、インデックスをキューに渡すだけです。それ以外の場合は、実際のキューとインデックスを含む構造体を渡すことができます

于 2012-05-20T14:23:27.503 に答える