其他分享
首页 > 其他分享> > c-如何终止正在等待信号量操作的线程

c-如何终止正在等待信号量操作的线程

作者:互联网

我正在编写一个使用共享内存和ipc信号灯的程序.有一个主服务器进程创建共享内存和信号灯.任何数量的客户端进程都可以连接到共享内存,并在允许时对其进行读写.信号量提供了阻止机制来控制读取和写入.一切正常,除非我尝试终止客户端.用于访问共享内存的信号量块在一个线程中,并且在进程终止时,我无法释放信号量块,因此线程可以正确退出.我将如何处理?这是针对Linux的.

具体来说,有一个shm和两个sems.第一学期阻止写作,第二学期阻止阅读.当客户端有要写入的内容时,它将等待写入sem为0,然后将其设置为1,进行写入,然后将读取sem设置为0,这将释放等待的服务器以读取客户端写入的内容.读取后,服务器会将写入sem设置回0,并且下一个客户端将开始写入.它挂在一个semop调用上,当读sem为0时释放该semop调用.此semop调用在线程中,我需要弄清楚如何在退出主线程之前正确退出该线程.

这是我想做的但不起作用的示例(睡眠伪装成挂断电话):

#include <stdlib.h>
#include <errno.h>
#include <pthread.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>

void termination_handler (int signum) {
    printf( "Got Signal\n" );
}

void *threadfunc( void *parm ) {
    struct sigaction action;

    action.sa_handler = termination_handler;
    sigemptyset( &action.sa_mask );
    action.sa_flags = 0;

    sigaction( SIGUSR1, &action, NULL );

    printf("Thread executing\n");

    sleep( 100 ); // pretending to be the semaphore

    pthread_exit( NULL );
}

int main() {
    int       status;
    pthread_t threadid;
    int       thread_stat;

    status = pthread_create( &threadid, NULL, threadfunc, NULL );

    if ( status <  0) {
        perror("pthread_create failed");
        exit(1);
    }

    sleep( 5 );

    status = pthread_kill( threadid, SIGUSR1 );

    if ( status <  0 )
        perror("pthread_kill failed");

    status = pthread_join( threadid, (void *)&thread_stat );
    if ( status <  0 )
        perror("pthread_join failed");

    exit( 0 );
}

解决方法:

他说,这是针对Linux的.

如果您可以确切说出自己的做法,这将很有用.我假设您正在阻止sem_wait或sem_timedwait.如果您的线程在那阻塞,您想中断它,可以使用pthread_kill.

pthread_kill(blocking_thread_id, SIGUSR1);

当然,您需要设置适当的信号处理程序(man sigaction)以捕获SIGUSR1,并且需要检查sem_wait()的返回码以获取EINTR,在这种情况下,您可以知道被中断并可以做任何想做的事情.没有锁.

如果您使用的是进程,则只需使用kill()而不使用pthread_kill()提供进程ID. (对不起,起初我误读并认为您正在使用线程)

标签:pthreads,semaphore,c-3,linux,ipc
来源: https://codeday.me/bug/20191024/1920663.html