首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

pthread_join不起作用,互斥在C中也不起作用

pthread_join是一个用于等待指定线程结束的函数。它的原型如下:

代码语言:txt
复制
int pthread_join(pthread_t thread, void **retval);

其中,thread是要等待的线程的标识符,retval是一个指向指针的指针,用于获取线程的返回值。

如果pthread_join不起作用,可能有以下几个可能的原因:

  1. 线程标识符错误:请确保传递给pthread_join的线程标识符是正确的,即确保它是有效的线程标识符。
  2. 线程已经被分离:如果线程已经被分离,那么它的资源会在结束时自动释放,无法再使用pthread_join等待它结束。在创建线程时,可以使用pthread_detach函数将线程设置为分离状态,或者在创建线程时设置线程属性为分离状态。
  3. 线程已经结束:如果线程已经结束,那么pthread_join将立即返回,并且不会等待。可以通过在线程函数中使用pthread_exit显式地退出线程,或者让线程函数自然结束来确保线程不会提前结束。
  4. 线程没有被创建:如果pthread_join在指定的线程还没有被创建时调用,它将返回EINVAL错误。请确保在调用pthread_join之前,已经创建了要等待的线程。

关于互斥在C中不起作用的问题,可能有以下几个可能的原因:

  1. 互斥锁未正确初始化:在使用互斥锁之前,需要使用pthread_mutex_init函数对互斥锁进行初始化。请确保在使用互斥锁之前,已经正确地初始化了互斥锁。
  2. 互斥锁未正确加锁和解锁:在使用互斥锁保护临界区代码时,需要使用pthread_mutex_lock函数对互斥锁进行加锁,使用pthread_mutex_unlock函数对互斥锁进行解锁。请确保在进入临界区之前加锁,在离开临界区之后解锁。
  3. 互斥锁未正确销毁:在不再需要使用互斥锁时,需要使用pthread_mutex_destroy函数对互斥锁进行销毁。请确保在不再使用互斥锁时,已经正确地销毁了互斥锁。

以上是可能导致pthread_join和互斥在C中不起作用的一些常见原因。如果问题仍然存在,可能需要进一步检查代码逻辑和调试。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • List.append() Python 不起作用,该怎么解决?

    Python ,我们通常使用 List.append() 方法向列表末尾添加元素。然而,某些情况下,你可能会遇到 List.append() 方法不起作用的问题。...变量重新赋值 Python ,列表是可变对象,也就是说,它们可以通过引用进行修改。...由于 my_list 和 new_list 引用同一个列表对象,因此对 new_list 的修改会反映在 my_list 上。2....列表作为函数参数另一个导致 List.append() 方法不起作用的常见情况是将列表作为函数的参数传递。 Python ,函数参数传递是通过对象引用实现的。...结论List.append() 方法 Python 通常是一个方便且常用的方法,用于向列表末尾添加元素。然而,当遇到某些情况时,它可能不起作用

    2.6K20

    【Linux】<互斥量>解决<抢票问题>——【多线程竞争问题】

    本章主要内容面向接触过C++的老铁 主要内容含: 一.抢票问题展示——“票数变成负数” 1.问题展示: 下面代码所示 我们会发现票数逐渐减少,最后甚至 减成了负数 但是明明我们route函数里面设置的..., 任何一个时刻, 只允许一个线程正在访问共享资源 我们把我们进程访问临界资源的代码片段,称为 临界区 对应上文提到抢票问题,我们明确了共享区,以及该加锁解锁的位置,如下图所示:...} 方法2,动态初始化 动态初始化的互斥使用完毕后需要显式调用pthread_mutex_destroy函数进行销毁 int pthread_mutex_init(pthread_mutex_t...(thread1, NULL); pthread_join(thread2, NULL); // 注意:动态初始化的互斥量需要显式销毁 // 销毁互斥量...解决 现在明确了 共享区与要加锁的位置 ,清楚了 锁(互斥量)的语法 改进原来的售票系统: #include #include #include

    12210

    基于BlockingQueue的生产者消费者模型

    现实生活人口密集的地方肯定会有超市,生产者消费者模型效率高,有了超市这个巨大的缓存,可以使得消费者和生产者并发起来。...其与普通的队列区别在于,当队列为空时,从队列获取元素的操作将会被阻塞,直到队列中被放入了元素;当队列满时,往队列里存放元素的操作会被阻塞,直到有元素被从队列取出(以上的操作都是基于不同的线程来说的,...; //消费者条件变量 }; Pop 函数:从队列取出元素,并将其存储 out 指针指向的地址。...(c,nullptr); pthread_join(p,nullptr); return 0; } 上述测试代码是传递一个int类型的数据到阻塞队列可以传递其他类型,传递struct...(c,nullptr); pthread_join(p,nullptr); return 0; } 多生产、多消费模型 创建两个消费者线程 c1 和 c2,它们会并行地从队列取出任务并处理

    10110

    Posix多线程编程

    而运行于一个进程的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间远远小于进程间切换所需要的时间。...当然,数据的共享带来其他一些问题,有的变量不能同时被两个线程所修改,有的子程序声明为static的数据更有可能给多线程程序带来灾难性的打击,这些正是编写多线程程序时最需要注意的地方。...void ** status:如果不为NULL,那么线程的返回值存储status指向的空间中(这就是为什么status是二级指针的原因!这种才参数称为“值-结果”参数)。...(pid, NULL); 35 pthread_join(pid1, NULL); 36 return 0; 37} 注意,gcc,默认是不包含线程相关的库的,所以在编译这个程序操作如下是会产生错误的...图4-3-27 创建线程的实验结果 pthread.c创建了2个线程,并在线程实现打印功能,最终调用pthread_join等待子线程运行结束,一并退出。

    81540

    多线程编程C语言版

    运行于一个进程的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间远远小于进程间切换所需要的时间。...线程退出与等待 Demo1我们用到了pthread_join这个函数 #include int pthread_join(pthread_t thread, void **retval...Linux线程属性总结文章参考: https://blog.csdn.net/nkguohao/article/details/38796475 线程的同步互斥 开头说道,多线程的程序,多个线程共享堆栈空间...,那么就会存在问题 互斥多线程的程序,多个线程共享临界区资源,那么就会有竞争问题,互斥锁mutex是用来保护线程间共享的全局变量安全的一种机制, 保证多线程某一时刻只允许某一个线程对临界区的访问.../main 字符指针数组的内容是:str2 str1 读写锁 读写锁与互斥量类似,不过读写锁允许更改的并行性,叫共享互斥锁。

    3.6K31

    Linux系统编程-(pthread)线程通信(互斥锁)

    这篇文章介绍Linux下线程同步与互斥机制–互斥锁,多线程并发的时候,都会出现多个消费者取数据的情况,这种时候数据都需要进行保护,比如: 火车票售票系统、汽车票售票系统一样,总票数是固定的,但是购票的终端非常多...一个时刻只能有一个线程掌握某个互斥锁,拥有上锁状态的线程才能够对共享资源进行操作。若其他线程希望上锁一个已经上锁了的互斥锁,则该线程就会挂起,直到上锁的线程释放掉互斥锁为止。 1....互斥锁介绍 在编程,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。...如果当前线程拥有参数mutex 所指定的互斥体,该调用将该互斥体解锁。 如果解锁成功,将返回0. 说明: 对同一个锁多次解锁没有叠加效果,如果锁是上锁状态,那么多次解锁只有一次有效。 3....等待线程的介绍*/ pthread_join(thread_id,NULL); pthread_join(thread_id2,NULL); //销毁互斥锁 pthread_mutex_destroy

    2.2K10

    详解Linux多线程互斥锁、读写锁、自旋锁、条件变量、信号量

    ---- Hello、Hello大家好,我是木荣,今天我们继续来聊一聊Linux多线程编程的重要知识点,详细谈谈多线程同步和互斥机制。...大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。 互斥多任务操作系统,同时运行的多个任务可能都需要使用同一种资源。...原子性:互斥锁是一个原子操作,操作系统保证如果一个线程锁定了一个互斥锁,那么其他线程同一时间不会成功锁定这个互斥锁 唯一性:如果一个线程锁定了一个互斥锁,它解除锁之前,其他线程不可以锁定这个互斥锁...return 0; } 读写锁 读写锁允许更高的并行性,叫共享互斥锁。...linux的自旋锁用结构体spinlock_t 表示,定义include/linux/spinlock_type.h。

    3.5K20

    linux实现线程同步的6种方法

    ); return 0; } 运行结果如下: # gcc no_lock_demo.c -o no_lock_demo.out -pthread # ....嵌套锁(PTHREAD_MUTEX_RECURSIVE):该锁允许一个线程释放锁之前多次对它加锁而不发生死锁;其他线程要获得这个锁,则当前锁的拥有者必须执行多次解锁操作;对一个已经被其他线程加锁的嵌套锁解锁...); return 0; } 条件变量 条件变量可以让调用线程满足特定条件的情况下运行,不满足条件时阻塞等待被唤醒,必须与互斥锁搭配使用。...mutex // 从条件变量cond唤出一个线程,令其重新获得原先的互斥锁 // 被唤出的线程此刻将从pthread_cond_wait函数返回,但如果该线程无法获得原先的锁,则会继续阻塞在加锁上...读写锁叫做共享-独占锁,当读写锁以读模式锁住时,它是以共享模式锁住的,当它以写模式锁住时,它是以独占模式锁住的,读读共享,读写互斥

    85920

    Linux下c语言多线程编程

    两条线程是同时随机交叉着运行的。 单核CPU就是这样子随机分配时间片给线程一直交换着执行,这叫并发执行。...+s2); return 0; } 例子5 上一个例子的代码重复率太高,我们对其优化,加入了结构体,只用了同一个函数。...因为第一条线程读s并s++的时候,第二条线程会来读,可能在第一条线程进行加之前读可能在加之后读,所以我们会丢失一些s++,所以每次运行出来的结果都不一样。...,写NULL就可以了,代表默认的快速互斥锁。...但通过“锁”就将资源的访问变成互斥操作,而后与时间有关的错误不会再产生了。 访问共享资源前加锁,访问结束后立即解锁。锁的“粒度”应越小越好。

    8.8K21

    futex函数_UNIXLINUX

    首先,同步的进程间通过mmap共享一段内存,futex变量就位于这段共享 的内存且操作是原子的,当进程尝试进入互斥区或者退出互斥区的时候,先去查看共享内存的futex变量,如果没有竞争发生,则只修改...POSIX标准定义了三种线程同步机制: Mutexes(互斥量), Condition Variables(条件变量)和POSIX Semaphores(信号量) 。...我们假设一下,如果抛开这个语义,如果允许semaphore值为负,则可以sem_post()的时候,实现futex机制。 2....是因为pthread_join(); Glibcpthread_join也是用futex系统调用实现的。...我们使用过程要知道他们的共性,得了解它们之间的差异。这样才能更好的理解多线程场景,写出更高质量的多线程程序。

    57820

    Linux线程-生产消费模型和线程池

    ,为了避免交易产所的数据混乱,我们需要将该临界资源用互斥锁保护起来。...那当生产者生产的数据将空间塞满后,生产者再频繁访问交易场所会是没有实际的效用;如果让消费者一直消费,那么当容器当中的数据被消费完后,消费者再频繁的访问交易产所会是没有实际的效用 虽然这样没什么问题...但此时该线程是拿着锁的,为了避免死锁问题,调用pthread_cond_wait函数时就需要传入当前线程手中的互斥锁,此时当该线程被挂起时就会自动释放手中的互斥锁,而当该线程被唤醒时又会自动获取到该互斥锁...便于例程中直接使用对象进行调用函数进行访问任务队列 多线程访问任务队列时需要维护同步与互斥,所以需要使用条件变量与互斥锁接口,为了更方便在静态例程函数中使用条件变量和互斥锁,我们需要进一步封装接口便于调用...,并提供一个访问它的全局访问点,该实例被所有程序模块共享 比如: 某个服务器程序,该服务器的配置信息存放在一个文件,这些配置数据由一个单例对象统一读取,然后服务进程的其他对象再通过这个单例对象获取这些配置信息

    3.2K20

    【Linux线程】Linux多线程编程:深入理解线程互斥与同步机制

    然而,多线程编程也是一把双刃剑,它在带来性能提升的同时,引入了线程安全、资源竞争等复杂问题 线程互斥与同步,正是解决这些问题、确保多线程程序正确运行的关键技术。...(如Java的Thread类,C++的std::thread类或第三方库的线程类) 实现线程的执行逻辑,通常是通过重写基类的run方法或实现一个可调用对象(如C++的std::function...:线程可以通知等待在条件变量上的其他线程,条件已经满足,可以继续执行 自动互斥大多数实现,条件变量的等待和通知操作是自动与互斥锁关联的,以避免竞争条件(Race Condition) 条件变量函数...总结 探索Linux多线程编程的旅程,我们深入了解了线程互斥与同步的重要性及其实现机制。...因此,我们不仅要掌握现有的互斥与同步技术,更要保持对新技术和新方法的敏锐洞察,以便在未来的挑战中立于不败之地 愿你未来的编程实践,能够灵活运用这些技术,创造出更加精彩、更加高效的并发应用。

    13510

    Linux应用开发【第五章】线程编程应用开发

    获取线程号 #include pthread_t pthread_self(void); 成功:返回线程号 程序,可以通过函数pthread_self,来返回当前线程的线程号...pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg); 成功:返回0 ​ 传统的程序...例程代码的27行,直接将int类型的变量强制转化为void *进行传递(针对不同位数机器,指针对其字数不同,需要int转化为long转指针,否则可能会发生警告),在线程处理回调函数,直接将void...当然初始化互斥可以调用宏来快速初始化: pthread_mutex_t mutex = PTHREAD_MUTEX_INITALIZER; 互斥锁加锁(阻塞)/解锁 #include <pthread.h...使用互斥锁的时候,尤其要注意使用pthread_cancel函数,防止发生死锁现象!

    1.4K20

    线程(二)线程互斥+线程同步

    代码必须要有互斥行为:当代码进入临界区执行时,不允许其他线程进入该临界区。 如果多个线程同时要求执行临界区的代码,并且临界区没有线程执行,那么只能允许一个线程进入该临界区。...如果线程不在临界区执行,那么该线程不能阻止其他线程进入临界区。 要做到这三点,本质上就是需要一把锁。Linux上提供的这把锁叫互斥量 ?...一个函数重入的情况下,运行结果不会出现任何不同或者任何问题,则该函数被称为可重入函数,否则,是不可重入函数。...形成死锁的四个必要条件 互斥条件:一个资源每次只能被一个执行流使用 请求与保持条件:一个执行流因请求资源而阻塞时,对已获得的资源保持不放 不剥夺条件:一个执行流已获得的资源,末使用完之前,不能强行剥夺...,它可能发现在其它线程改变状态之前,它什么做不了 例如一个线程访问队列时,发现队列为空,它只能等待,只到其它线程将一个节点添加到队列

    1.2K10

    【Linux】多线程安全之道:互斥、加锁技术与底层原理

    (t1, NULL); pthread_join(t2, NULL); pthread_join(t3, NULL); pthread_join(t4, NULL); } 执行结果: 这是没有加锁(互斥...如果多个线程同时要求执行临界区的代码,并且临界区没有线程执行,那么只能允许一个线程进入该临界区。 如果线程不在临界区执行,那么该线程不能阻止其他线程进入临界区。...2.三种加锁的方式 2.1全局变量(静态分布)的锁 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER 注意这种锁是定义全局代码段的,这种锁不需要销毁...attr:NULL 这种锁需要我们局部代码段进行定义和初始化,并且需要我们自己去手动销毁。...数据在内存,所有的线程都能访问,属于共享的。但是如果转移到CPU内部寄存器,就属于一个线程私有的了!!!

    10710

    【Pthreads学习笔记】基本使用

    (thread_id, NULL); } 在上面的代码, 程序最后加上了 pthread_join 函数, 用来完成线程间的同步, 即主线程等待指定的线程(在上面的代码是 thread_id 对应的线程...p_result 函数为了使线程执行完, 我们还可以访问到变量 m 的数据, m 的内存采用动态分配的方式, 如果静态分配, 即如 char m[3] 的形式, 那么函数执行完就会清空 m 的值,...的 创建线程时指定线程的 detach 属性: pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); 通过子线程调用 pthread_detach...(pthread_self()); 主线程调用 pthread_detach(thread_id);(非阻塞, 执行完会立即会返回), 通过上面的方式将线程设为 detached, 线程运行结束后会自动释放所有资源..., 一定要先初始化该互斥锁 释放互斥锁的线程必须是获得互斥锁的那个线程 当 destroy 互斥锁的时候, 不该有线程还在使用这个互斥锁 属性 动态创建互斥锁时, 我们可以传入一个锁属性变量 pthread_mutexattr_t

    67020
    领券