gpt4 book ai didi

C - 无法将线程传递到具有特定票号的关键部分

转载 作者:行者123 更新时间:2023-11-30 14:59:50 24 4
gpt4 key购买 nike

我正在尝试实现票证算法。我在那里有 X 个线程,我想通过票号同步它们进入关键部分,票号为 0 的线程将首先进入关键部分,数字 1 将作为第二输入,等等。

我在 while 循环中实现了这个关键部分问题,并在内部使用 if 条件来检查线程票号。但我希望避免使用主动等待 - 在循环中测试条件。

所以我在想是否有另一种方法可以使用互斥体包含条件,例如,线程被互斥体锁定并等待某个全局变量与线程的票号具有相同的值。

这是我的主动等待功能:

void *threadInitial(void *void_ptr){

// my thread structure with thread id and ticket number
Thread *threadActual = void_ptr;
// get ticket number
sem_wait(&semaphoreTicketGet);
threadActual->threadTicket = getticket();
sem_post(&semaphoreTicketGet);

while(1){
// check if this thread is allowed to enter critical section
if(threadActual->threadTicket != enterTicketNumber) continue;

sem_wait(&semaphoreTicketPrint);
// critical section
enterTicketNumber++;
sem_post(&semaphoreTicketPrint);
break;
}
return NULL;
}

这个函数的调用方式如下:

pthread_create(&threadsArr[count].threadPointer, NULL, threadInitial, &threadsArr[count])

你不知道如何解决吗?

最佳答案

您可以使用条件变量:

“条件变量为线程同步提供了另一种方式。互斥体通过控制线程对数据的访问来实现同步,而条件变量允许线程根据数据的实际值进行同步。”

https://computing.llnl.gov/tutorials/pthreads/#ConditionVariables

//global variable
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

void *threadInitial(void *void_ptr){

// my thread structure with thread id and ticket number
Thread *threadActual = void_ptr;

// get ticket number
sem_wait(&semaphoreTicketGet);
threadActual->threadTicket = getticket();
sem_post(&semaphoreTicketGet);

// wait for my turn
sem_wait(&semaphoreTicketPrint);
while (threadActual->threadTicket != enterTicketNumber)
pthread_cond_wait(&cond, &semaphoreTicketPrint);
enterTicketNumber++;
pthread_cond_signal(&cond);
sem_post(&semaphoreTicketPrint);

return NULL;

}

关于C - 无法将线程传递到具有特定票号的关键部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42490743/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com