gpt4 book ai didi

c - 线程池如何在 C 中创建带队列的线程池?

转载 作者:太空宇宙 更新时间:2023-11-04 04:35:28 25 4
gpt4 key购买 nike

所以我有以下内容:

具有“作业”的队列“q”每个作业都是一个字符('1'-'6')。我正在尝试创建一个 5 线程数组来处理这个队列,因此当一个线程完成其任务时,它会从队列中取出另一个线程。

例如队列是:

q = '3','4','3','3','5','3','4','3','3','5','3',' 4','3','3','5','3','4','3','3','5'

所以我很难解决这个问题。任何帮助都会非常感谢!

这里是我到目前为止所得到的:

int internal_count = 0;
pthread_t threads[5];
Queue que; // simple char queue (its working)
void createThreads(int numOfThreads) {
for (int i = 0; i < numOfThreads; i++) {
pthread_t tid;
threads[i] = pthread_create(&tid, NULL, start_thread, (void*) que);
if (threads[i] != 0) { /* error handling */ }
}
}

我不知道为什么它还没有在这个方法中运行..

void* start_thread(void* arg) {
char job;
int fd;
int x = random_number(10, 100); // its working
struct timespec tim, tim2;
pthread_t ptid;
char *message;
while (que.size == 0) {

}
pthread_mutex_lock(&lock);
// ADD MUTEX!!!!!!!!!!!!!
job = que.Dequeue();

switch(job) {
case '1':
// go to sleep
tim.tv_sec = 0;
tim.tv_nsec = x * 1000000L;
nanosleep(&tim , &tim2);
internal_count++;
break;
case '2':
// go to sleep
tim.tv_sec = 0;
tim.tv_nsec = x * 1000000L;
nanosleep(&tim , &tim2);
internal_count += 2;
break;
case '3':
// go to sleep
tim.tv_sec = 0;
tim.tv_nsec = x * 1000000L;
nanosleep(&tim , &tim2);
internal_count += 3;
break;
case '4':
// go to sleep
tim.tv_sec = 0;
tim.tv_nsec = x * 1000000L;
nanosleep(&tim , &tim2);
internal_count += 4;
break;
case '5':
// go to sleep
tim.tv_sec = 0;
tim.tv_nsec = x * 1000000L;
nanosleep(&tim , &tim2);
internal_count += 5;
break;
case '6':
ptid = pthread_self();
message = fromIntToString((int) ptid);
strcat(message, ",");
strcat(message, fromIntToString(internal_count));
strcat(message, "\n");
break;
default:break;
}
pthread_mutex_unlock(&lock);
return NULL;

}

最佳答案

您还没有发布完整的代码,但是基于现有问题的快速注释:

  • 检查您是否正确初始化了 pthread 互斥锁。查看 pthread_mutex_init 或 PTHREAD_MUTEX_INITIALIZER

  • 您仅将锁定对象用于队列操作。但是,除非您以原子方式管理它,否则您还需要一个用于队列大小函数的关键部分。

  • 关于为什么你的线程函数没有运行,你必须深入研究,看看你的线程是否没有启动或者它们无法继续。您可以通过在线程函数内设置断点轻松地做到这一点。同样在 GDB 中,您可以使用“信息线程”来查看创建的线程。

  • 与其使用 while 循环来检查任务是否已提交到队列,我强烈建议您使用条件变量,因为它们是您正在执行的操作的内置同步原语。

这篇文章使用 C++ 并使用 C++11 线程库,但提供了有关条件变量和如何实现线程安全队列的很好的信息,因为这是实现线程池需要了解的内容:

Implementing a thread safe queue using condition variables

关于c - 线程池如何在 C 中创建带队列的线程池?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30956506/

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