gpt4 book ai didi

C P线程数

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

我是 C pthreads 的新手,我遇到了一些小问题。我想制作一个在我的 var 结果 = 13 时停止的程序。我有两个线程在我的结果中添加或减去一个随机数。问题是,在编译的情况下,减法线程从不工作。Result、Step 和 Mutex 是我的全局变量。感谢大家

void add(){
int random;
while(result < 101){
random = rand() % 51;
pthread_mutex_lock(&mutex);
result += random;
step += 1;
pthread_mutex_unlock(&mutex);
printf("%d. [random -> %d, result now -> %d] ADD\n",step,random,result);

}
pthread_exit(0);


void sub(){
int random;
while(result > 5){
random = rand() % 51;
pthread_mutex_lock(&mutex);
result -= random;
step +=1;
pthread_mutex_unlock(&mutex);
printf("%d. [random -> %d, result now -> %d] SUB\n",step,random,result);

}
pthread_exit(0);

void main(int argc, char**argv){

pthread_t th1;
pthread_t th2;

pthread_mutex_init(&mutex,NULL);

if(pthread_create(&th1, NULL, add, NULL)!= 0)
printf("ERROR: Thread 1 not created");

if(pthread_create(&th2, NULL, sub,NULL)!=0)
printf("ERROR: Thread 2 not created");

while(result != 13){

}
pthread_cancel(th1);
pthread_cancel(th2);

pthread_exit(0);

最佳答案

这里有很多错误:


rand不是线程安全的,因此它应该被移动到受互斥锁保护的临界区。


您的线程应该执行 while(true)结合 pthread_yield/sched_yield而不是 while(result > 5)while(result < 101) :

while (true) {
if (result >= 101) {
pthread_yield();
continue;
}
...

否则您的线程可能会提前停止。例如。想象result100并且添加功能添加42对它来说,下一次迭代该线程将被停止。


一般pthread_cancelpthread_join 结合使用.

使用上面讨论的解决方案,pthread_cancel 可能需要一段时间从 printf 开始完成不需要是取消点,线程只能在此类取消点上取消。另见 here (取消点和)。

所以你可以做的是添加一个 bool 参数 stop_thread如果为真,则停止 while 循环并退出循环。现在如果result13设置 stop_threadmaintruepthread_join在线程上。加入后result虽然可能会改变。如果result不应该改变那么你应该检查13在线程本身中。


你的函数签名是错误的。 pthread_create期待 void *(*start_routine)(void*) .因此,将您的功能更改为

void *add(void*) {
...
return NULL; /* no pthread_exit needed */
}

有了这样的签名,甚至可以将参数交给线程而不是依赖全局变量。


无需调用pthread_exitmain .


即使进行了所有这些更改,该程序也不太可能完成。 main必须准确安排在 result 时是13这是非常不可能的,因为在 13 的情况下没有取消点,没有 yield 等。在线程中。因此,如果 result == 13,您最有可能做的是检查线程本身。并阻止他们。您必须确保等待互斥量的其他线程不会修改 result虽然。

您还应该添加 pthread_yieldmain 的循环中以确保其他线程将运行。

关于C P线程数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28513898/

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