首页
学习
活动
专区
工具
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.7K20

    【Linux】线程互斥与同步

    条件变量 当⼀个线程互斥地访问某个变量时,发现在其它线程改变状态之前,它什么也做不了。例如⼀个线程访问队列时,发现队列为空,它只能等待,只到其它线程将⼀个节点添加到队列中。...基于BlockingQueue的生产者消费者模型   在多线程编程中阻塞队列(Blocking Queue)是⼀种常⽤于实现⽣产者和消费者模型的数据结构。...其与普通的队列区别在于,当队列为空时,从队列获取元素的操作将会被阻塞,直到队列中被放入了元素;当队列满时,往队列⾥存放元素的操作也会被阻塞,直到有元素被从队列中取出(以上的操作都是基于不同的线程来说的,..., bq); pthread_join(c1, nullptr); pthread_join(p1, nullptr); delete bq; return...(c1, nullptr); pthread_join(c2, nullptr); pthread_join(p1, nullptr); pthread_join(p2, nullptr

    8700

    【linux学习指南】线程同步与互斥

    :当代码进入临界区执行时,不允许其他进程进入该临界区 如果多个线程同时要求进入临界区的代码,并且临界区没有线程在执行,那么只能一个线程进入该临界区 如果现场不在临界区中执行,那么该现场就不能阻止其他进程进入临界区...); pthread_mutex_destroy(&mutex); return 0; } RAII风格的互斥锁,C++11也有,比如: std : : mutex mtx; std...: : lock_guard guard ( mtx ) ; 线程同步 条件变量 当⼀个线程互斥地访问某个变量时,它可能发现在其它线程改变状态之前,它什么也做不了。...例如⼀个线程访问队列时,发现队列为空,它只能等待,只到其它线程将⼀个节点添加到队列中。这种情况就需要⽤到条件变量。...同步概念与竞态条件 同步:在保证数据安全的前提下,让线程能够按照某种特定的顺序访问临界资源,从⽽有效避免饥饿问题,叫做同步 竞态条件:因为时序问题,⽽导致程序异常,我们称之为竞态条件。

    4300

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

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

    13210

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

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

    10810

    【Linux】:多线程(互斥 && 同步)

    线程同步 2.1 条件变量 当⼀个线程互斥地访问某个变量时,它可能发现在其它线程改变状态之前,它什么也做不了 例如⼀个线程访问队列时,发现队列为空,它只能等待,只到其它线程将⼀个节点添加到队列中。...线程同步和互斥:这个类的实现是线程安全的,确保了在多线程环境中通过条件变量来实现线程间的协调。...其与普通的队列区别在于,当队列为空时,从队列获取元素的操作将会被阻塞,直到队列中被放入了元素;当队列满时,往队列里存放元素的操作也会被阻塞,直到有元素被从队列中取出 3.3 C++ queue 模拟生产消费者模型...(c1, nullptr); //pthread_join(c2, nullptr); pthread_join(p1, nullptr); //pthread_join(p2,...当然我们也可以进行多生产多消费,大家也可以自己试试,这里就不过多测试啦 多线程生产者消费者模型高效是因为:一个生产者在生产任务的时候,其他生产者在构建任务,一个消费者在获取任务的时候,其他消费者在处理任务

    9310

    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等待子线程运行结束,一并退出。

    82140

    多线程编程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.7K20

    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函数中返回,但如果该线程无法获得原先的锁,则会继续阻塞在加锁上...读写锁也叫做共享-独占锁,当读写锁以读模式锁住时,它是以共享模式锁住的,当它以写模式锁住时,它是以独占模式锁住的,读读共享,读写互斥。

    87720

    【C语言】进程和线程详解

    C语言进程和线程详解 1. 进程和线程的对比 在现代操作系统中,进程和线程是实现并发执行的两种主要方式。理解它们的区别和各自的应用场景对于编写高效的并发程序至关重要。...进程管理 3.1 进程创建 在C语言中,可以使用fork系统调用来创建一个新进程。fork会创建一个与原进程(父进程)几乎相同的新进程(子进程),子进程会从fork调用的地方开始执行。...实战:生产者-消费者问题 生产者-消费者问题是多线程编程中的经典问题,生产者线程生成数据,消费者线程消费数据,两者通过缓冲区进行通信,需要使用互斥锁和条件变量来确保线程同步。...通过互斥锁和条件变量,确保了生产者和消费者之间的正确同步。 7. 进程和线程在应用中的选择 在实际应用中,选择使用进程还是线程取决于具体的需求和场景。...通过上述详解,相信你对C语言中的进程和线程有了更深入的理解,并能够在实际编程中灵活运用。 9.

    11510

    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(); 在Glibc中,pthread_join也是用futex系统调用实现的。...我们在使用过程中要知道他们的共性,也得了解它们之间的差异。这样才能更好的理解多线程场景,写出更高质量的多线程程序。

    60620

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

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

    3.3K20

    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_cancel函数,防止发生死锁现象!

    1.4K20

    【在Linux世界中追寻伟大的One Piece】多线程(二)

    int pthread_detach(pthread_t thread); 可以是线程组内其他线程对目标线程进行分离,也可以是线程自己分离。...(t1, NULL); pthread_join(t2, NULL); pthread_join(t3, NULL); pthread_join(t4, NULL); } 一次执行结果:...如果多个线程同时要求执行临界区的代码,并且临界区没有线程在执行,那么只能允许一个线程进入该临界区。 如果线程不在临界区中执行,那么该线程不能阻止其他线程进入临界区。要做到这三点,本质上就是需要一把锁。...如果一个函数中有全局变量,那么这个函数既不是线程安全也不是可重入的。 3.6 -> 可重入与线程安全区别 可重入函数是线程安全函数的一种。...不剥夺条件:一个执行流已获得的资源,在末使用完之前,不能强行剥夺。 循环等待条件:若干执行流之间形成一种头尾相接的循环等待资源的关系。

    6810
    领券