Skip to main content

Posts

Programming: Windows Threading Vs Linux Threading (Part 6)

A thread cleanup handler in Linux and Windows thread cancellation: A cleanup handler is a measure, used to deallocate a resource only if the thread exits or canceled. To register a cleanup handler, need to call pthread_cleanup_push() and pass a pointer to cleanup function and the void * argument. The pthread_cleanup_pop() function removes the routine at the top of the calling thread's cancellation cleanup stack and optionally invokes it (if execute is non-zero). The following sample code shows how a dynamically allocated buffer from a thread can be deallocated on canceling the thread in Linux. #include < pthread.h > #include < stdio.h > #include < string.h > #include < unistd.h >  char *pgArray = 0; /* Buffer allocation */ char * allocate_array (size_t size) {     return new char[size]; } void release_array (void *pArg) {     if(pgArray)     {         printf("release_array() called..\n");         delete []pgArray;     }

Programming: Windows Threading Vs Linux Threading (Part 5)

Thread Cancellation in GNU/Linux : Today, I'm interested to explore how we can prepare thread in GNU/Linux to ignore thread cancellation. This is acvhieved with pthread_setcancelstate(). The signature of the function is: int pthread_setcancelstate(int state, int *oldstate);  The function is thread and signal safe. The function sets the cancel  state to one of PTHREAD_CANCEL_ENABLE or  PTHREAD_CANCEL_DISABLE and returns the old cancel state. Please see the second parameter. void *Print_Details(void *param) {      printf("This is secondary thread's entry...\n");      int oldState;      pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldState);      sleep(1);      for(int i = 0; i < 10; ++i)      {           printf("Inside the secondary thread...\n");      }      pthread_setcancelstate(oldState, NULL);      printf("This is secondary thread's exit...\n");      return NULL; } /* Main program */ int main() {      pt

Programming: Windows Threading Vs. Linux Threading (Part 4)

Thread Cancellation is a way where it's necessary sometimes to terminate a thread explicitly from another thread. In Windows we have a Function, it's TerminateThread() The function signature : BOOL WINAPI TerminateThread(   _Inout_  HANDLE hThread,   _In_     DWORD dwExitCode ); This function is always asynchronous. It never guarantees that the thread will always terminate by the time the function returns. This function never cleans up a stack of destroyed threads. So, it's not recommended to use this function until it's absolutely necessary. Note : As mentioned by Jeffrey Richter, Microsoft designed this API purposely implemented this way to terminate thread(s). This ensures that other threads are still running and accessing the terminated threads stack will not get an access violation. So, by leaving the terminated threads stack in memory, other threads which are accessing the stack of the killed thread can continue to execute. In Linux we have a function, i

Programming: Windows Threading Vs Linux Threading (Part 3)

Continued from Part 2: In Linux, normally (when we use default pthread_attribute , aka sending null to pthread_create()), we're creating the  joinable thread . There is another type of thread named detached thread , which We'll see later. A joinable thread is like a process, isn't automatically cleaned up by GNU/Linux when it terminates. Instead, its exit states hang around the system (like a zombie process) until the thread called pthread_join() obtains its return value. Let's see what happens in the Windows world: When the thread terminates (the normal way, aka the thread function returns), it ensures the following : 1. All C++ objects created in the thread function will be destroyed properly via their destructor. 2. The OS will clean up memory owned by the thread's stack. 3. The system will decrement threads kernel objects usage count. The following code snippet (GNU/Linux) shows a thread created using pthread_create() with default pthread_attr_t

Programming: Windows Threading Vs Linux Threading (Part 2)

This is in continuation of the previous article 'Windows Threading Vs. Linux Threading ', here we'll see a subtle but significant difference in the  thread start routine which gets a call from CreateThread() API in the Windows world or pthread_create() function call in the Linux world. The ThreadProc function in Windows : DWORD WINAPI ThreadProc(   _In_  LPVOID lpParameter ); This is an application-defined function that serves as the starting address for a thread. Note: As per MSDN, Do not declare this callback function with a void return type and cast the function pointer to LPTHREAD_START_ROUTINE when creating the thread. Code that does this is common, but it can crash on 64-bit Windows . The return value indicates the success or failure of this function. The return value should never be set to STILL_ACTIVE (259). In Linux : The function passed as start_routine in the pthread_create() function should correspond to the following C function prototype:  void

Programming: Windows Threading Vs Linux Threading

In this article, I'm trying to show some differences between Windows and Linux thread creation and their respective usage. Creating Threads: 1.     a. In Windows: CreateThread() API is used to create a thread to execute within the virtual address space of the calling process.     b. In Linux: pthread_create() function creates a thread.     Function Signature:     // Windows     HANDLE WINAPI CreateThread(           _In_opt_   LPSECURITY_ATTRIBUTES lpThreadAttributes,           _In_       SIZE_T dwStackSize,           _In_       LPTHREAD_START_ROUTINE lpStartAddress,           _In_opt_   LPVOID lpParameter,           _In_       DWORD dwCreationFlags,           _Out_opt_  LPDWORD lpThreadId     );     Function Signature:     // Linux     int pthread_create(pthread_t *thread, const pthread_attr_t *attr,          void *(*start_routine)(void *), void *arg);     In Windows: We can pass stack size in bytes if required to the same CreateThread() API.     In Linux:  The stack size is set in

A STL vector usage through shared_ptr

We know vector can store homogeneous kind of stuff. That is, it can store type int, string etc individually but not element of type int with string etc. However, sometimes we might have requirements that it can store elements which are in inheritance relation and can do stuff by calling function of respective element stored in vector. As an example, I've a Shape class from which I've derived Circle, Polygon etc. Now I want to store Circle, Polygon object in a vector and then access each element by its iterator and draw shape accordingly. C++ 2011 made it possible via shared_ptr. Thanks to Stephan aka STL. Code snippet #include < iostream > #include < memory > #include < vector > using namespace std; class Shape { public:     Shape(){}     virtual ~Shape(){}     virtual void draw(int x, int y)     {         cout << "Shape::draw(" << x << ", " << y << ")" << endl;     } private:     Shape(const Sh