gpt4 book ai didi

c - 问题中信号量锁无法正常工作

转载 作者:行者123 更新时间:2023-11-30 14:45:28 25 4
gpt4 key购买 nike

我遇到分配问题,其中指出:

服务器可以设计限制打开的数量连接。例如,服务器可能希望在任何时候都只有 N 个套接字连接及时。一旦建立了 N 个连接,服务器将不再接受另一个传入的连接连接,直到现有连接被释放。编写一个使用信号量的程序同步服务器事件以限制并发连接数。

为了解决这个问题,我创建了 2 个信号量:

  1. 初始化为 N 的信号量。
  2. 提供互斥的信号量。

我必须以这样的方式创建,如果建立了所有 N 个连接,客户端必须等待直到释放。

我尝试对其进行编码,但代码无法正常工作:

 #include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
#include<semaphore.h>
#include<stdlib.h>
#include<string.h>

sem_t allow;
sem_t mutex;

void *acquire(void * arg)
{
int tid = *(int *)arg;
tid+=1;
sem_wait(&mutex);

sem_wait(&allow);


printf("\n Client %d is connected to the server....",tid);
sem_post(&mutex);
sleep(rand()%10);
release(tid);

}
void release(int num)
{
printf("\n Client %d releases the Server ....",num);
sem_post(&allow);
}
void main(int argc,char ** argv)
{
int n;
int i;
printf("\n Enter the number of client :");
scanf("%d", &n);
int maxi=3; // maximum no. of connection available
sem_init(&allow,0,maxi); // semaphore that is initialised to maxi.
//no. of connection
sem_init(&mutex,0,1); // for mutual exclusion

pthread_t thread[n];

for(i=0;i<n;i++) {
pthread_create(&thread[i],NULL,acquire,&(i)); // Clients are
// acquiring ..
}

for(i=0;i<n;i++)
pthread_join(thread[i],NULL);

sem_destroy(&allow);
sem_destroy(&mutex);

}

它给出不同的执行顺序,例如,甚至在获取连接(客户端“x”)之前,它会释放连接,例如..

输出:

Enter the number of client :6

Client 3 is connected to the server....

Client 3 is connected to the server....

Client 4 is connected to the server....

Client 3 releases the Server ....

Client 6 is connected to the server....

Client 3 releases the Server ....

Client 6 is connected to the server....

Client 4 releases the Server ....

Client 1 is connected to the server....

Client 6 releases the Server ....

Client 6 releases the Server ....

Client 1 releases the Server ....

请帮我改正代码!!

抱歉,标题不好!!!

最佳答案

最可能的问题是您如何创建线程:

pthread_create(&thread[i],NULL,acquire,&(i));

作为线程的参数,您传递一个指向局部变量i的指针。问题是所有线程都获得相同的指针,这可能意味着多个线程可以取消引用它并获得相同的值!

通常情况下,人们不应该真正将普通值转换为指针,但在这种情况下,它通常是被接受的。但是,您不应直接转换为指针,而应使用 standard fixed width type intptr_t 然后将其转换为指针:

pthread_create(&thread[i],NULL,acquire,(void *) (intptr_t) i);

然后在线程函数中进行相反的转换:

void *acquire(void * arg)
{
int tid = (int) (intptr_t) arg;
...
}

这样每个线程都会有自己的“id”。

关于c - 问题中信号量锁无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53047421/

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