23,116
社区成员
发帖
与我相关
我的任务
分享
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/wait.h>
static pthread_mutex_t task_lock = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t taskLock_change = PTHREAD_COND_INITIALIZER;
static pthread_mutex_t task_lock_handler = PTHREAD_MUTEX_INITIALIZER;
#define MYSIG_TASKLOCK 35
enum task_lock_status {
TASK_UNLOCK = 0,
TASK_LOCK = 1
};
enum task_lock_status g_lock_status;
typedef struct {
pthread_t pid; /* ID of thread */
} PTHREAD_SIG;
#define PTHREAD_MAX 30
PTHREAD_SIG g_pthread_sig[PTHREAD_MAX];
void taskLock()
{
pthread_t pid = 0;
int loop;
pthread_mutex_lock( &task_lock );
/*g_lock_status = TASK_LOCK;
pid = pthread_self();
for(loop = 0; loop < PTHREAD_MAX; loop++)
{
if( (g_pthread_sig[loop].pid != 0) && (g_pthread_sig[loop].pid != pid) )
{
pthread_kill(g_pthread_sig[loop].pid, MYSIG_TASKLOCK);
}
}*/
}
void taskUnlock()
{
g_lock_status = TASK_UNLOCK;
//pthread_cond_broadcast( &taskLock_change );
pthread_mutex_unlock( &task_lock );
return;
}
void* thread_entry(void *argv)
{
pthread_t pid = 0;
int loop = 0;
pid = pthread_self();
printf("pthread_id:%ld start!\n", pid);
while(1)
{
printf("pthread_id:%ld firstly printf, loop=%d\n", pid, loop);
loop ++;
if(loop > 10)
{
break;
}
}
sleep(1);
taskLock();
printf("pthread_id:%ld lock start\n", pid);
for(loop =0; loop < 20; loop++)
{
printf("pthread_id:%ld is doing:%d\n", pid, loop);
}
printf("pthread_id:%ld lock end\n", pid);
taskUnlock();
sleep(1);
loop = 0;
while(1)
{
printf("pthread_id:%ld secondly printf, loop=%d\n", pid, loop);
loop ++;
if(loop > 10)
{
break;
}
}
sleep(1);
printf("pthread_id:%ld end!\n", pid);
pthread_exit(NULL);
}
void sig_handler_lock( int signal, siginfo_t *siginfo, void *u_contxt )
{
pthread_cleanup_push( (void(*)(void *))pthread_mutex_unlock,
(void *)&task_lock_handler );
while(g_lock_status == TASK_LOCK)
{
pthread_cond_wait( &taskLock_change, &task_lock_handler );
}
pthread_cleanup_pop( 1 );
return;
}
int main(int argc,char** argv)
{
pthread_t ptid;
int loop = 0;
int result = 0;
void * status;
pthread_cond_init(&taskLock_change, NULL);
memset(g_pthread_sig, 0, sizeof(g_pthread_sig));
struct sigaction sigact;
memset(&sigact, 0, sizeof(sigact));
sigact.sa_sigaction = sig_handler_lock;
sigact.sa_flags = SA_SIGINFO;
sigemptyset(&sigact.sa_mask);
sigaction(MYSIG_TASKLOCK, &sigact, NULL);
for(loop = 0; loop < PTHREAD_MAX; loop++)
{
result = pthread_create(&ptid, NULL, thread_entry, NULL);
if(result !=0 )
{
printf("pthread_create result is:%d\n", result);
return -1;
}
else
{
printf("pthread_create ptid=%ld\n", ptid);
g_pthread_sig[loop].pid = ptid;
}
}
for(loop = 0; loop < PTHREAD_MAX; loop++)
{
pthread_join(g_pthread_sig[loop].pid, &status);
}
return 0;
}