运行互斥锁,但无法创建多个线程

时间:2018-06-13 05:31:02

标签: c multithreading pthreads mutex

我正在尝试模拟服务器/客户端套接字通信,并为每个客户端使用线程,然后使用互斥锁来锁定和解锁这些客户端。

Mutex运行正常,即使我打开另一个终端并运行客户端脚本,它也会被阻塞,直到服务器解锁它,但由于一些错误的编码原因,第二个客户端从第一个客户端获取相同的ID。

所以,我想在每次运行新客户端时创建一个新线程。但我认为这就是" fork"由于某种原因,这是问题......

int counter = 0;
int i = 0;
int j = 0;
void* operacoes (void*);
pthread_mutex_t mutexA = PTHREAD_MUTEX_INITIALIZER;
pthread_t thread_id [10];
int var;
int jo = 0;
int t = 0;
int main()
{
    int sock_fd, sock_len, sock_novo, sock_novo_len,num;
    struct sockaddr_un sock_ser, sock_cli;
    char msg[100];

    sock_fd = socket(AF_UNIX, SOCK_STREAM,0);

    if(sock_fd<0)
    {
    printf("ERROR\n");
    exit(0);
    }
    unlink("socket.unix.teste");
    bzero((char*)&sock_ser, sizeof(sock_ser));
    sock_ser.sun_family = AF_UNIX;
    strcpy(sock_ser.sun_path,"socket.unix.teste");
    sock_len = strlen(sock_ser.sun_path) +sizeof(sock_ser.sun_family);
    if(bind(sock_fd,(struct sockaddr*)&sock_ser,sock_len)<0)
    {
    printf("ERROR\n");
    exit(0);
    }

    listen(sock_fd,5);

    for(;;)
    {
    sock_novo_len = sizeof(sock_cli);
    sock_novo = accept(sock_fd, (struct sockaddr*)&sock_cli,&sock_novo_len);

    if(fork() == 0)
    {
        close(sock_fd);
        num = atoi(msg);

        counter++;
        for (i = jo; i<counter; i++)
        {
        pthread_create (&thread_id[i], NULL, operacoes, (void *)num);        
        jo++; 
        }
        for (j = t; j<counter; j++)
        {
        pthread_join(thread_id[j], NULL);;
        t++;
        }
        exit(0);
    }
    close(sock_novo);
    }
    return 0;
}

void* operacoes (void *arg)
{
    if(arg == 1)
    {
        int id = pthread_self();
        printf("Thread nummber: %d \n", id);
        pthread_mutex_lock (&mutexA);
        printf("Locked\n");
        sleep(10);      
        pthread_mutex_unlock (&mutexA);
        printf("Unlocked\n");   
    }
return 0;
}

在客户端,我只发送一个变量&#39; msg&#39;。

我该怎么解决?我尝试使用这两个变量&#39; jo&#39;并且&#39;#,但是我创建的每个新客户端,它读取整个代码,然后它返回到0,所以我无法获得下一个phthread_create的向量位置。

1 个答案:

答案 0 :(得分:0)

假设我理解你想要达到的目标:

  1. 创建一个unix域套接字并侦听传入连接
  2. 并行处理每个连接
  3. 在处理连接期间锁定/解锁一个全局互斥锁
  4. 试试这个:

    project settings > select your main app target > Build phases > Compile Sources