2013-04-12 28 views
1

我有一个创建pthread的主函数。我试图用信号量在选定的时间打印一个全局变量(注意:互斥体,S1,S2,以及memoryUsed所有全局声明):如何阻止pthread从main打印全局变量,然后继续pthread?

int main(int argc, const char * argv[]) 
{ 
    pthread_mutex_init(&mutex, NULL); 
    sem_init(&s1, 0, 0); 
    sem_init(&s2, 0, 0); 

    pthread_t t0; 
    pthread_create(&t0, NULL, &matrix_management, NULL); 

    sem_wait(&s1); // wait for signal from pthread 
    printf("Memory Usage from main: %d bytes\n\n", memoryUsed); // global var 
    sem_post(&s2); // signal pthread to continue 

    pthread_join(t0, NULL); 
    sem_destroy(&s1); 
    sem_destroy(&s2); 
    pthread_mutex_destroy(&mutex); 
    return 0; 
} 

在我的目标函数,我想停止在选定的点并从main打印一个全局变量。请注意,目标函数中的变量已更改。有一次,我打印,我想继续目标函数:

void *matrix_management(void *len) 
{ 
    pthread_mutex_lock(&mutex); 

    // CHANGE GLOBAL VAR 
    memoryUsed = 1; 

    sem_post(&s1); // print from main 
    sem_wait(&s2); // wait for signal 

    // continue thread... 


    pthread_mutex_unlock(&mutex); 
    return NULL; 
} 

然而,主线程似乎并没有在所有的信号等待从并行线程。它立即打印其全局变量的值。如果我在pthread中注释掉信号,程序不会死锁。你能像这样在MAIN线程和pthread之间使用信号量吗?

回答

0

根据您的平台,可能不支持未命名的信号量。以下情况适用于这种情况,尽管您可能需要创建临时名称并稍后将其用于取消链接。我熟悉这一点的唯一原因是因为我通常使用的平台OS X不支持通过10.8.3的未命名信号量,因此无法检测到我与您的代码看到的类似行为,因为所有信号量API失败。

希望它有帮助。

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 
#include <semaphore.h> 
#include <assert.h> 

sem_t* s1=NULL, *s2=NULL; 
int memoryUsed = 0; 

void *matrix_management(void *len) 
{ 
    // CHANGE GLOBAL VAR 
    memoryUsed = 1; 

    sem_post(s1); // print from main 
    sem_wait(s2); // wait for signal 
    printf("Thread woken up.\n"); 

    // continue thread... 
    return NULL; 
} 

int main(int argc, const char * argv[]) 
{ 
    s1 = sem_open("s1", O_CREAT, S_IRUSR | S_IWUSR, 0); 
    s2 = sem_open("s2", O_CREAT, S_IRUSR | S_IWUSR, 0); 
    assert(s1 && s2 && "Failed to allocate semaphores."); 

    pthread_t t0; 
    pthread_create(&t0, NULL, &matrix_management, NULL); 

    sem_wait(s1); // wait for signal from pthread 
    printf("Memory Usage from main: %d bytes.\n", memoryUsed); // global var 

    printf("Waking thread...\n"); // global var 
    sem_post(s2); // signal pthread to continue 

    pthread_join(t0, NULL); 
    printf("Thread finished\n"); 
    sem_close(s1); 
    sem_close(s2); 
    sem_unlink("s1"); 
    sem_unlink("s2"); 
    return 0; 
} 

输出

Memory Usage from main: 1 bytes. 
Waking thread... 
Thread woken up. 
Thread finished 
+0

这确实是问题。不知道关于OS X.谢谢你的帮助! – whblackburn