すべてのスレッドの要約(つまり、スレッドグループの総計)を印刷しようとしていたとき、私は立ち往生しました。スレッドを完了した後でプロセスを続行するには?
以下のCコードは、チケットを販売するエージェントをシミュレートする10のスレッドを実行します。 &を実行した後(つまり、すべてのチケットが販売された後)、エージェントのリストとそのエージェントが販売したチケットの番号を印刷します。しかし、メインプロセスは、pthread_exit(NULL)
(前のコメントでマークされています)に当たってすぐに終了し、コードはmain
に戻りません。ここで総計が出力されます(このブロックにはコメントも表示されます) 。
コードに何が間違っているか誰にでも教えてください。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
struct ThreadArgs {
int thNum;
int *numTickets;
int *soldTickets;
sem_t *lock;
};
void *SellTickets(void *th) {
struct ThreadArgs *thArgs;
int sleepTime;
thArgs = th;
while (1) {
sleepTime = rand();
if (sleepTime % 2) {
usleep(sleepTime % 1000000);
}
sem_wait(thArgs->lock);
if (*thArgs->numTickets == 0) {
break;
}
printf("There are %3d ticket(s). Agent %d sold a ticket.\n", *thArgs->numTickets, thArgs->thNum);
(*thArgs->numTickets)--;
sem_post(thArgs->lock);
(*thArgs->soldTickets)++;
}
sem_post(thArgs->lock);
pthread_exit(NULL);
}
void runThreads(int numAgents, int numTickets, int soldTickets[]) {
struct ThreadArgs thArgs[numAgents];
int agent;
pthread_t th[numAgents];
sem_t lock;
sem_init(&lock, 1, 1);
for (agent = 0; agent < numAgents; agent++) {
thArgs[agent].thNum = agent;
thArgs[agent].soldTickets = &soldTickets[agent];
thArgs[agent].numTickets = &numTickets;
thArgs[agent].lock = &lock;
pthread_create(&th[agent], NULL, SellTickets, &thArgs[agent]);
}
// when debugging, the process terminates here
pthread_exit(NULL);
}
int main() {
int agent, numAgents, numTickets, soldTickets[10];
numAgents = 10;
numTickets = 150;
for (agent = 0; agent < numAgents; agent++) {
soldTickets[agent] = 0;
}
runThreads(numAgents, numTickets, soldTickets);
// the process never executes the following block
for (agent = 0; agent < numAgents; agent++) {
printf("Agent %d sold %d ticket(s).\n", agent, soldTickets[agent]);
}
return 0;
}
なぜメインスレッドで 'pthread_exit()'しますか? – EOF
@ EOF:あなたの方法を試しました。 'return'文の直前に' pthread_exit() '行を' main'に持ってきました。しかし、今回はスレッドがまったく実行されませんでした。 forループ(すべてのエージェントのチケットがゼロ)とセグメント分割エラーが出力されます。 – ssd
私はあなたが*試みることができる方法を教えていませんでした。私は*なぜ*あなたがしていることをやっているのかを尋ねていた。あなたのコードは私には意味がありません。 – EOF