c - 如何通过在本地使用互斥变量来锁定线程?

标签 c linux multithreading pthreads mutex

当我在 pthread 中编写互斥锁时,我曾经在全局范围内创建互斥锁变量 (pthread_mutex_t mutex)。当我看到许多示例程序时,大多数情况下互斥变量都放置在全局范围内。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
void *add1_fun(void* arg);
void *add2_fun(void* arg);
pthread_mutex_t mutex;

void *add1_fun(void* arg) 
{
    int t_num = (int)arg;
    int i = 0;

    pthread_mutex_lock(&mutex);

    printf("Thread %d created and running \n", t_num); /*critical section start*/
    sleep(3);
    printf("Thread %d finishes the work\n", t_num); /*critical section end*/
    pthread_mutex_unlock (&mutex);

    pthread_exit(NULL);
}

int main(int argc, char *argv[])
{
    pthread_t mythread1;
    pthread_t mythread2;
    pthread_attr_t myattr;
    void *joinResult;
    int x = 0;
    int t_arg = 1;
    pthread_mutex_init(&mutex, NULL);
    pthread_attr_init(&myattr);
    pthread_attr_setdetachstate(&myattr, PTHREAD_CREATE_JOINABLE);                 

    if((pthread_create(&mythread1, &myattr, add1_fun,  (void*)t_arg) != 0)){
        printf("Error, thread not created properly\n");
        return 1;
    }
    t_arg = 2;
    if((pthread_create(&mythread2, &myattr, add1_fun,  (void*)t_arg) != 0)){
        printf("Error, thread not created properly\n");
        return 1;
    }
    pthread_attr_destroy(&myattr);
    if(pthread_join(mythread1, &joinResult) != 0 ){
        printf("Error pthread join \n");
        return 1;
    }
    printf("Main : Thread1 joined with result of %d\n", (int)joinResult);
    if(pthread_join(mythread2, &joinResult) != 0 ){
        printf("Error pthread join \n");
        return 1;
    }
    printf("Main : Thread2 joined with result of %d\n", (int)joinResult);
    printf("main finishes the work\n");

    pthread_exit(NULL);
}

我怀疑的是,在这种情况下,程序中的任何地方都可以使用互斥变量并且 锁定和解锁互斥量。这会降低安全性。

是否可以通过在线程处理程序中本地创建互斥变量来锁定线程。像下面的程序结构

void *add1_fun(void* arg)
{
    pthread_mutex_t mutex;
    pthread_mutex_lock(&mutex);

/* critical section */

    pthread_mutex_unlock (&mutex);
}
int main()
{
   /* code */
}

我觉得这个问题可能没有意义,请帮帮我,我不擅长多线程。

我在 linux 下使用 gcc。

谢谢。

最佳答案

局部变量仅对特定函数调用是局部的。如果您希望“本地”变量在函数调用之间是静态的,那么您必须将变量设置为 static

关于c - 如何通过在本地使用互斥变量来锁定线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20617095/

相关文章:

c - valgrind 条件跳转或移动取决于未初始化的值

c - 为什么我的内核线程只执行一次?

linux - 无论如何,是否可以使用 Hudson 将 .war 或 .jar 从一台服务器传输到另一台服务器?

Java继承问题: What's the difference and why ? 这给程序员带来了什么优势和灵活性?

c++ - 如何在 Qt 中的另一个线程中发出插槽信号

ios - fork() 通过使用 svc 调用实现

C内存管理错误?

c - 在 libpcap pcap_loop() 回调上传递参数

linux - 在 shellscript 中的 zenity 之后调用 wmctrl 不起作用

c - 重新启动 fork 进程中的线程