タスクを取得し、リンクリストであるキューに配置するディスパッチキューのcファイルを作成しています。これを行うには、使用してスレッドを作成する必要があります
pthread_t cThread;
if(pthread_create(&cThread, NULL, work, param)){
perror("ERROR creating thread.");
}
ただし、create関数のパラメーターとして「work」変数と「param」変数に入る別の関数を作成する必要があります。私の友人は、スレッドが死ぬことがないように無限にループするコードを作業関数に置くだけでよいと言ってくれました。各パラメーターがpthread_create
関数-特にwork
およびparam
の場合?私はこれをGoogleで検索しましたが、ほとんどのチュートリアルはコンセプトを理解するのがとても難しいです...
pthread_create
の4つのパラメーターは、順番に:
pthread_t
構造体へのポインター。これは、pthread_create
が作成するスレッドに関する情報を入力します。
スレッドのパラメーターを持つpthread_attr_t
へのポインター。ほとんどの場合、NULL
を渡すだけで安全です。
スレッドで実行する関数。関数はvoid *
を返し、void *
引数を受け取る必要があります。引数は必要に応じて使用できます。 (たとえば、同じ関数で複数のスレッドを開始する場合は、このパラメーターを使用してそれらを区別できます。)
スレッドを開始するvoid *
。必要ない場合はNULL
を渡します。
ダスクワフの答えを明確にする:
work
パラメータは関数ポインタです。関数は、タイプvoid *
および戻り値void *
として示される1つの引数を取る必要があります。
param
は、work
が受信するデータへのポインタであることが期待されています。
例として、2つのintをワーカーに渡したいとしましょう。次に、次のようなものを作成できます。
int *param = (int *)malloc(2 * sizeof(int));
param[0] = 123;
param[1] = 456;
pthread_create(&cThread, NULL, work, param);
次に、作業関数はポインター型を変換し、パラメーターデータを取得します。
void *work(void * parm) {
int *param = (int *)parm;
int first_val = param[0];
....
}
渡す必要のあるすべてのデータを含む構造体を作成するなど、より複雑なことを行うことができます。